如果您在跟踪设备位置时捏合放大/缩小Apple的地图应用程序,则会忽略捏合手势的“平移”组件,蓝色位置指示器将保持固定在屏幕中央。使用普通MKMapView
时不是这种情况。
假设我已经有用户的位置,我怎么能达到这个效果?我已尝试在委托的regionDid/WillChangeAnimated:
方法中重置中心坐标,但只在手势的开头和结尾调用它们。我还尝试添加一个UIPinchGestureRecognizer
子类,在触摸移动时重置中心坐标,但这会导致渲染故障。
修改:对于有兴趣的人,以下内容适用于我。
// CenterGestureRecognizer.h
@interface CenterGestureRecognizer : UIPinchGestureRecognizer
- (id)initWithMapView:(MKMapView *)mapView;
@end
// CenterGestureRecognizer.m
@interface CenterGestureRecognizer ()
- (void)handlePinchGesture;
@property (nonatomic, assign) MKMapView *mapView;
@end
@implementation CenterGestureRecognizer
- (id)initWithMapView:(MKMapView *)mapView {
if (mapView == nil) {
[NSException raise:NSInvalidArgumentException format:@"mapView cannot be nil."];
}
if ((self = [super initWithTarget:self action:@selector(handlePinchGesture)])) {
self.mapView = mapView;
}
return self;
}
- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
return NO;
}
- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
return NO;
}
- (void)handlePinchGesture {
CLLocation *location = self.mapView.userLocation.location;
if (location != nil) {
[self.mapView setCenterCoordinate:location.coordinate];
}
}
@synthesize mapView;
@end
然后只需将其添加到MKMapView
:
[self.mapView addGestureRecognizer:[[[CenterGestureRecognizer alloc] initWithMapView:self.mapView] autorelease]];
答案 0 :(得分:5)
当用户在实际设备上捏住屏幕(而不是模拟器)时,它会导致pan 和捏合手势 - 捏合包含动作的“缩放”元素,并且平移包含垂直和水平变化。您需要拦截并阻止平移,这意味着使用UIPanGestureRecognizer
。
将scrollEnabled
设置为NO
,然后添加UIPanGestureRecognizer
以重置中心坐标。该组合将阻止单指平移和捏合的平移组件。
编辑以添加更多详细信息,并在看到您的代码后:在pan已经开始之后调用touchesMoved:withEvent
,因此如果您在那里更改MKMapView的中心,您将获得你描述过的那些乱糟糟的渲染问题。你真正需要的是创建一个带有目标动作的UIPanGestureRecognizer
,如下所示:
UIPanGestureRecognizer *pan = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didRecognizePan)] autorelease];
pan.delegate = self;
[self.mapView addGestureRecognizer:pan];
...然后向您的控制器添加didRecognizePan
方法,并在那里进行中心重置。
答案 1 :(得分:0)
只是一个猜测,但您是否尝试在scrollEnabled
开始时将NO
设置为regionWillChangeAnimated:
?
答案 2 :(得分:0)
也是一个猜测。在regionWillChangeAnimated开始时:保存当前地图区域,然后使用self.myMapView.region = theSavedRegion或类似内容通过NSTimer不断更新区域。然后在调用regionDidChangeAnimated:时使计时器失效。
但是,您可能遇到NSTimer更新区域导致再次调用regionWillChangeAnimated的问题。
试一试,看看会发生什么。