У меня возникла ситуация, когда я хотел бы разместить UIView (это не мой код) поверх другого UIView и иметь события, которые распространяются в нижней части экрана. Чтобы быть более конкретным, я хотел бы разместить UIView поверх MKMapView.Пропустить события на другое представление
У меня есть UIView, который содержит оба вида (как подвид). Я хотел бы, чтобы мой uiview передавал события с его точки зрения на оба его подсмотра.
.h:
@interface MyUIView : UIView
@end
.m:
#import "MyMapView.h"
#import <MapKit/MapKit.h>
#import "MapGestureRecognizer.h"
@implementation MyMapView
MKMapView *mkMapView;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
mkMapView = [[MKMapView alloc] initWithFrame:frame];
[self addSubview:mkMapView];
// Create another view to place on top of the mkMapView
// This is not my view I do not control is codebase. I would like to put it on top of the mkMapView
// and still have the mkMapView receive touch events
UIView * otherView = [[UIView alloc] initWithFrame:frame];
otherView.backgroundColor = [UIColor clearColor];
[self addSubview:otherView];
MapGestureRecognizer *mgr = [[MapGestureRecognizer alloc] init];
mgr.touchesBeganCallback = ^(NSSet * touches, UIEvent * event) {
UITouch *touch = [[event allTouches] anyObject];
NSLog(@"touches began=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);
[mkMapView touchesBegan:touches withEvent:event];
};
mgr.touchesCancelledCallback = ^(NSSet * touches, UIEvent * event) {
UITouch *touch = [[event allTouches] anyObject];
NSLog(@"touches cancelled=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);
[mkMapView touchesCancelled:touches withEvent:event];
};
mgr.touchesEndedCallback = ^(NSSet * touches, UIEvent * event) {
UITouch *touch = [[event allTouches] anyObject];
NSLog(@"touches ended=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);
[mkMapView touchesEnded:touches withEvent:event];
};
mgr.touchesMovedCallback = ^(NSSet * touches, UIEvent * event) {
UITouch *touch = [[event allTouches] anyObject];
NSLog(@"touches moved=%@", [NSString stringWithFormat:@"%i", touch.view.tag]);
[mkMapView touchesMoved:touches withEvent:event];
};
[self addGestureRecognizer:mgr];
return self;
}
@end
Я реализовал свой собственный жест распознаватель, чтобы перехватить эти события, и я пытаюсь перейти к перехваченным событиям через к mkMapView. Я вижу сообщения журнала, но, похоже, это не пропускает события, поскольку я могу сделать прокрутку/панорамирование mkmapview.
Я думаю, что я запутал вопрос. Жесты распознаются на верхнем уровне. Это именно то, что я пытаюсь сделать. Однако, когда представление верхнего уровня получает жест, я хочу переслать это в одно из моих подзонов. В этом случае я пересылаю его в mkMapView [mkMapView touchhesBegan: затрагивает событиеEvent: event]; , но это не похоже на то, что он действительно пересылается. – lostintranslation
Извините, я не читал ваши комментарии подробно, я не считаю, что вы можете передавать события касания, которые происходят в одном представлении, к другому виду просто потому, что системы координат из двух представлений будут разными. Аффинное преобразование, применимое к представлениям изображений, будет работать, но, вероятно, не методы, использующие UIEvents. – Paulo
Я не хочу давать вам ложные решения, но попробуйте понять, когда начинаются прикосновения, переместите слой карты сверху, чтобы вы могли использовать методы, которые вы закодировали, а затем переместите другой вид поверх вида карты. после внесения корректировок. – Paulo