我正在尝试实现自定义按钮来跟踪MKUserTrackingMode。我知道有一个MKUserTrackingBarButtonItem然而我无法使用,因为我的按钮不在工具栏/导航栏中,所以我无法实现我自己的逻辑。
基本上我想要与MKUserTrackingBarButtonItem提供的逻辑相同,但我很难实现它。基本上,如果在MKUserTrackingModeNone中并且单击该按钮,则移动到带有动画的MKUserTrackingModeFollow。这是我的问题出现的地方,如果地图动画,而切换此状态我不希望用户能够到达下一个状态MKUserTrackingModeFollowWithHeading。 IE用户必须等到地图动画完成并且用户在mapview中居中才能移动到MKUserTrackingModeFollowWithHeading状态。主要是我的问题是试图检测mapview何时完成动画。
我已实施:
- (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的转换实际上没有为地图设置动画时出现问题,因为地图已经在用户位置的中心。 I.E.我说我要用动画跟踪用户,所以我设置了self.isTrackingAnimation = YES;但它永远不会被设置为NO,因为地图实际上从未动画过。
IE如果我在[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]上有完成块;并且完成块在地图动画之前不会触发(或者如果它不需要动画,则不会触发)我会没事的。
我能想到的其他事情就是在设置usertrackingmode时检查地图是否确实需要动画,如果它不需要动画我不能设置self.isTrackingAnimation。
想法?
答案 0 :(得分:1)
您应该实现委托方法self.isTrackingAnimation = YES;
并在那里设置标记,而不是在按钮按下处理程序中设置regionWillChangeAnimated:
。
答案 1 :(得分:0)
你可能想要去KVO的路线,观察地图视图上的实际属性变化。我们在我们自己的栏按钮项目中执行了此操作,该项目与我们构建的SDK中的地图视图相关联 - 而不是MapKit,但是相同的想法(MapKit的开源版本)。
https://github.com/mapbox/mapbox-ios-sdk/blob/release/MapView/Map/RMUserTrackingBarButtonItem.m
具体观看地图视图:
采取行动改变: