Ios 用于跟踪MKUserTrackingMode的自定义按钮
我正在尝试实现一个自定义按钮来跟踪MKUserTrackingMode。我知道有一个mkUserTrackingBarButtonim,但是我不能使用它,因为我的按钮不在工具栏/导航栏中,所以我无法实现自己的逻辑 基本上,我想要与mkusertrackingbarbuttonite提供的逻辑相同的逻辑,但我在实现这一点时遇到了困难。基本上,如果在MKUserTrackingModeNone中并单击按钮,则移动到mkusertrackingmode并跟随动画。这就是我的问题所在,如果地图在切换此状态时设置了动画,我不希望用户能够进入下一个状态MKUserTrackingModeFollowWithHeading。IE用户必须等待地图动画完成,并且用户在地图视图中居中,才能移动到MKUSERTRACKINGMODE FOLLOWWITHHEADING状态。我的问题主要是试图检测mapview何时完成动画制作 我已实施:Ios 用于跟踪MKUserTrackingMode的自定义按钮,ios,mkmapview,mapkit,Ios,Mkmapview,Mapkit,我正在尝试实现一个自定义按钮来跟踪MKUserTrackingMode。我知道有一个mkUserTrackingBarButtonim,但是我不能使用它,因为我的按钮不在工具栏/导航栏中,所以我无法实现自己的逻辑 基本上,我想要与mkusertrackingbarbuttonite提供的逻辑相同的逻辑,但我在实现这一点时遇到了困难。基本上,如果在MKUserTrackingModeNone中并单击按钮,则移动到mkusertrackingmode并跟随动画。这就是我的问题所在,如果地图在切换此状
- (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;但它从未设置为“否”,因为贴图从未实际设置动画
IE如果我在[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]上有一个完成块;直到贴图设置动画(如果不需要设置动画,也可以不设置),完成块才会启动。我会很好
我认为唯一可以做的另一件事是,在设置usertrackingmode时检查贴图是否确实需要动画,如果不需要动画,我无法设置self.isTrackingAnimation
想法?而不是设置
self.isTrackingAnimation=YES
在按钮按下处理程序中,您应该实现委托方法regionWillChangeAnimated:
,并在那里设置标志。您可能希望转到KVO路径,以观察地图视图上的实际属性更改。我们在自己的工具栏按钮项中实现了这一点,它与我们构建的SDK中的地图视图相关联——不是MapKit,而是相同的想法(MapKit的开源版本)
具体请参见查看地图视图:
以及根据变化采取行动:
啊,糟糕,我怎么会错过这个!regionWillChange将标志设置为YES,regionDidChange将标志设置为NO。非常感谢。