UIMapView: UIPinchGestureRecognizer не вызывается - PullRequest
2 голосов
/ 21 августа 2011

Я реализовал распознаватель жестов в UIMapView, как описано в принятом ответе на этот вопрос: Как перехватить события касаний в объектах MKMapView или UIWebView?

Одиночные касания распознаются правильно. Однако, когда я изменил суперкласс моего класса с UIGestureRecognizer на UIPinchGestureRecognizer для распознавания масштабирования карты, все перестало работать. Теперь событие TouchesEnded происходит только тогда, когда пользователь дважды нажимает на аннотацию на карте (не знаю, почему!), И не происходит, когда пользователь сжимает карту (увеличение или уменьшение масштаба не имеет значения).

PS Я использую iOS SDK 4.3 и тестирую свое приложение в симуляторе, если это имеет значение.

Код mapViewController.m - метод viewDidLoad:

 - (void)viewDidLoad
 {
     [super viewDidLoad];
     MapGestureRecognizer *changeMapPositionRecognizer = [[MapGestureRecognizer alloc] init];
     changeMapPositionRecognizer.touchesEndedCallback = ^(NSSet * touches, UIEvent * event) 
     {
        ...
     };
     [self.mapView addGestureRecognizer:changeMapPositionRecognizer];
     [changeMapPositionRecognizer release];
}

Код MapGestureRecognizer.h:

#import <UIKit/UIKit.h>
typedef void (^TouchesEventBlock) (NSSet * touches, UIEvent * event);
@interface MapGestureRecognizer : UIPinchGestureRecognizer    
@property(nonatomic, copy) TouchesEventBlock touchesEndedCallback;
@end

Код MapGestureRecognizer.m:

#import "MapGestureRecognizer.h"

@implementation MapGestureRecognizer
@synthesize touchesEndedCallback = _touchesEndedCallback;

- (id)init
{
    self = [super init];
    if (self) {
        self.cancelsTouchesInView = NO;
}

    return self;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (self.touchesEndedCallback)
    {
        self.touchesEndedCallback(touches, event);
        NSLog(@"Touches ended, callback done");
    }
    else
    {
        NSLog(@"Touches ended, callback skipped");
    }
}

- (void) dealloc
{
    [super dealloc];
}

@end

Что я должен исправить, чтобы сделать распознавание жеста щипка?

1 Ответ

5 голосов
/ 21 августа 2011

Я не уверен, почему вам нужно создавать подкласс UIPinchGestureRecognizer вместо того, чтобы использовать его как есть.

Также не уверен, зачем вам нужен распознаватель жестов для определения масштабирования карты, что вы можете сделать, используя методы делегатов regionWillChangeAnimated и regionDidChangeAnimated и сравнивая диапазон до и после.Если вы не пытаетесь определить масштабирование, как оно происходит (и не хотите ждать, пока пользователь не завершит жест)

Возможно, не вызывается распознаватель жестов, потому что вместо этого вызывается собственный распознаватель жестов представления представления карты..

Чтобы ваш распознаватель вызывался так же, как и представления карты, реализуйте метод делегата UIGestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer и возвращайте YES:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:
        (UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

Убедитесь, что свойство распознавателя жестов delegate имеетset или этот метод также не будет вызван.

...