Mit*_*try 2 iphone mkmapview uigesturerecognizer ios4
我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];
}
Run Code Online (Sandbox Code Playgroud)
MapGestureRecognizer.h的代码:
#import <UIKit/UIKit.h>
typedef void (^TouchesEventBlock) (NSSet * touches, UIEvent * event);
@interface MapGestureRecognizer : UIPinchGestureRecognizer
@property(nonatomic, copy) TouchesEventBlock touchesEndedCallback;
@end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我应该纠正什么才能识别捏手势?
小智 5
我不确定为什么你需要子类UIPinchGestureRecognizer而不是直接使用它.
另外不知道为什么你需要的手势识别,检测地图缩放,您可以通过委托方法做regionWillChangeAnimated,并regionDidChangeAnimated和跨度前后对比.除非您尝试检测正在发生的缩放(并且不想等到用户完成手势)
手势识别器可能没有被调用,因为地图视图自己的捏手势识别器正在被调用.
要让您的识别器与地图视图一起调用,请实现UIGestureRecognizer委托方法shouldRecognizeSimultaneouslyWithGestureRecognizer并返回YES:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Run Code Online (Sandbox Code Playgroud)
确保设置了手势识别器的delegate属性,或者也不会调用该方法.
| 归档时间: |
|
| 查看次数: |
1606 次 |
| 最近记录: |