UIMapView:未调用UIPinchGestureRecognizer

时间:2011-08-21 17:06:04

标签: iphone ios4 mkmapview uigesturerecognizer

我在UIMapView中实施了手势识别器,正如此问题的已接受答案中所述:How to intercept touches events on a MKMapView or UIWebView objects?

正确识别单个触摸。但是,当我将班级的超类从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 个答案:

答案 0 :(得分:5)

我不确定为什么你需要继承UIPinchGestureRecognizer而不是直接使用它。

还不确定为什么需要手势识别器来检测地图缩放,您可以使用委托方法regionWillChangeAnimatedregionDidChangeAnimated并比较之前和之后的跨度。除非您尝试检测正在发生的缩放(并且不想等到用户完成手势)

手势识别器可能没有被调用,因为地图视图自己的捏手势识别器正在被调用。

要让您的识别器与地图视图一起调用,请实现UIGestureRecognizer委托方法shouldRecognizeSimultaneouslyWithGestureRecognizer并返回YES:

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

确保设置了手势识别器的delegate属性,或者也不会调用该方法。