我正在尝试实现一个自定义按钮来跟踪MKUserTrackingMode。我知道有一个MKUserTrackingBarButtonItem,但是我不能使用它,因为我的按钮不在工具栏/导航条中,所以我无法实现自己的逻辑。
基本上,我想要与MKUserTrackingBarButtonItem提供的相同的逻辑,但是我很难实现这个逻辑。基本上,如果在MKUserTrackingModeNone和按钮被点击,移动到MKUserTrackingModeFollow动画。这就是我的问题所在,如果映射是动画的,同时切换此状态,我不希望用户能够进入下一个状态MKUserTrackingModeFollowWithHeading。IE用户必须等待地图动画完成,用户在地图视图中居中,才能移动到MKUserTrackingModeFollowWithHeading状态。主要是我的问题是试图检测什么时候地图视图是完成动画。
我已执行:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
self.isTrackingAnimation = NO;
}因此,当我的地图动画停止时,我设置了一个标志,以给我一个指示,我不再是动画。
我试图实现一种方法,该方法可以确定是否可以切换状态。
- (BOOL) setUserTrackingMode:(MKUserTrackingMode) mode {
if (self.isTrackingAnimation && mode == MKUserTrackingModeFollowWithHeading) return NO;
return YES;
}
- (IBAction)onTrackingButtonPressed:(id)sender {
switch (self.mapView.userTrackingMode) {
case MKUserTrackingModeNone: {
if ([self canSetUserTrackingMode:MKUserTrackingModeFollow]) {
[self.trackingButton setImage:[UIImage imageNamed:@"location_arrow_on.png"] forState:UIControlStateNormal];
[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];
self.isTrackingAnimation = YES;
}
break;
};
case MKUserTrackingModeFollow: {
if ([self canSetUserTrackingMode:MKUserTrackingModeFollowWithHeading]) {
[self.trackingButton setImage:[UIImage imageNamed:@"location_arrow_follow.png"] forState:UIControlStateNormal];
[self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
}
break;
};
case MKUserTrackingModeFollowWithHeading: {
if ([self canSetUserTrackingMode:MKUserTrackingModeNone]) {
[self.trackingButton setImage:[UIImage imageNamed:@"location_arrow_off.png"] forState:UIControlStateNormal];
[self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
}
break;
}
}
}当我将状态切换几次时,就会出现问题,因为从MKUserTrackingModeNone到MKUserTrackingModeFollow的转换实际上并不能激活地图,因为映射已经以用户位置为中心。也就是说,我说我要用动画跟踪用户,所以我设置了self.isTrackingAnimation = YES;但是它永远不会被设置为NO,因为地图实际上从来没有动过。
如果我在self.mapView setUserTrackingMode上有一个完成块:MKUserTrackingModeFollow动画:是的;而该完成块直到地图有动画才会触发(或者如果它不需要动画),我就没事了。
我唯一想做的事情是检查地图在设置usertrackingmode时是否真的需要动画,如果它不需要动画,我不能设置self.isTrackingAnimation。
想法?
发布于 2014-11-20 00:58:52
与其在按钮按下处理程序中设置self.isTrackingAnimation = YES;,不如实现委托方法regionWillChangeAnimated:并在那里设置标志。
发布于 2014-11-21 00:37:55
您可能想走KVO的路线,在地图视图上观察实际的属性变化。我们是在我们自己的bar按钮项中这样做的,它与我们构建的SDK中的地图视图绑定在一起--不是MapKit,而是相同的想法(MapKit的开源版本)。
https://github.com/mapbox/mapbox-ios-sdk/blob/release/MapView/Map/RMUserTrackingBarButtonItem.m
特别是查看地图视图:
以及对变化采取的行动:
https://stackoverflow.com/questions/27029854
复制相似问题