在捏取MKMapView时保持中心坐标

时间:2011-05-15 05:05:15

标签: iphone objective-c ios mkmapview

如果您在跟踪设备位置时捏合放大/缩小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]];

3 个答案:

答案 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的问题。

试一试,看看会发生什么。