Лучший способ, который я нашел для достижения этой цели, - это распознаватель жестов. Неясно, хотите ли вы распознать события масштабирования самостоятельно или просто определить, когда пользователь выполняет масштабирование / панорамирование.
Мне не нужно обнаруживать панорамирование или масштабирование карты - мне просто важно, чтобы пользователь указал пальцем где-нибудь в MKMapView. Если вам нужно обнаружить масштабирование или панорамирование со 100% отзывом и точностью, это может быть более сложным, чем это. Что нам действительно нужно, так это реализация MKMapView с открытым исходным кодом, поэтому мы можем добавить это к делегату, среди многих других функций.
Вот что я делаю: Реализация распознавателя жестов, который не может быть предотвращен и который не может предотвратить другие распознаватели жестов. Добавьте его в вид карты и работайте с соответствующими событиями касания по своему желанию.
Как обнаружить любой сигнал внутри MKMapView (без хитростей)
WildcardGestureRecognizer * tapInterceptor = [[WildcardGestureRecognizer alloc] init];
tapInterceptor.touchesBeganCallback = ^(NSSet * touches, UIEvent * event) {
self.lockedOnUserLocation = NO;
};
[mapView addGestureRecognizer:tapInterceptor];
WildcardGestureRecognizer.h
//
// WildcardGestureRecognizer.h
// Copyright 2010 Floatopian LLC. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef void (^TouchesEventBlock)(NSSet * touches, UIEvent * event);
@interface WildcardGestureRecognizer : UIGestureRecognizer {
TouchesEventBlock touchesBeganCallback;
}
@property(copy) TouchesEventBlock touchesBeganCallback;
@end
WildcardGestureRecognizer.m
//
// WildcardGestureRecognizer.m
// Created by Raymond Daly on 10/31/10.
// Copyright 2010 Floatopian LLC. All rights reserved.
//
#import "WildcardGestureRecognizer.h"
@implementation WildcardGestureRecognizer
@synthesize touchesBeganCallback;
-(id) init{
if (self = [super init])
{
self.cancelsTouchesInView = NO;
}
return self;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if (touchesBeganCallback)
touchesBeganCallback(touches, event);
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
}
- (void)reset
{
}
- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event
{
}
- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer
{
return NO;
}
- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer
{
return NO;
}
@end