2014-02-21 2 views
4

У меня возникла ситуация, когда я хотел бы разместить 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.

ответ

0

Устройство распознавания жестов работает с самым верхним видом, если другой вид сверху на вид с помощью прикрепленного распознавателя жестов, устройство распознавания не срабатывает. Быстрым и грязным способом было бы присвоить тот же набор распознавателей другому представлению и соответствующим образом отбросить их, когда это не понадобится. Действие не должно выполняться на том же представлении, которое получает жесты, получая жесты панорамы в Otherviews, а затем панорамирование карты в фоновом режиме должно работать.

+0

Я думаю, что я запутал вопрос. Жесты распознаются на верхнем уровне. Это именно то, что я пытаюсь сделать. Однако, когда представление верхнего уровня получает жест, я хочу переслать это в одно из моих подзонов. В этом случае я пересылаю его в mkMapView [mkMapView touchhesBegan: затрагивает событиеEvent: event]; , но это не похоже на то, что он действительно пересылается. – lostintranslation

+0

Извините, я не читал ваши комментарии подробно, я не считаю, что вы можете передавать события касания, которые происходят в одном представлении, к другому виду просто потому, что системы координат из двух представлений будут разными. Аффинное преобразование, применимое к представлениям изображений, будет работать, но, вероятно, не методы, использующие UIEvents. – Paulo

+0

Я не хочу давать вам ложные решения, но попробуйте понять, когда начинаются прикосновения, переместите слой карты сверху, чтобы вы могли использовать методы, которые вы закодировали, а затем переместите другой вид поверх вида карты. после внесения корректировок. – Paulo

0

изменить код ниже один->

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    mkMapView = [[MKMapView alloc] initWithFrame:frame]; 
    [self addSubview:mkMapView]; 

    UIView * otherView = [[UIView alloc] initWithFrame:frame]; 
    otherView.backgroundColor = [UIColor clearColor]; 
    [self addSubview:otherView]; 

    return self; 
} 

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ 
    return mkMapView; 
} 
+0

Хорошее объяснение. Есть ли способ, которым я могу достичь того, что хочу, по-другому? – lostintranslation

+0

проверьте обновленный код. – santhu

+0

Проблема с этим решением заключается в том, что я хочу, чтобы события касания переходили к обоим представлениям (mkMapView и otherView). Если вы переопределяете hitTest, то только одно subView получит событие, а не то, и другое. Это возможно? – lostintranslation

Смежные вопросы