Ios 用于跟踪MKUserTrackingMode的自定义按钮

Ios 用于跟踪MKUserTrackingMode的自定义按钮,ios,mkmapview,mapkit,Ios,Mkmapview,Mapkit,我正在尝试实现一个自定义按钮来跟踪MKUserTrackingMode。我知道有一个mkUserTrackingBarButtonim,但是我不能使用它,因为我的按钮不在工具栏/导航栏中,所以我无法实现自己的逻辑 基本上,我想要与mkusertrackingbarbuttonite提供的逻辑相同的逻辑,但我在实现这一点时遇到了困难。基本上,如果在MKUserTrackingModeNone中并单击按钮,则移动到mkusertrackingmode并跟随动画。这就是我的问题所在,如果地图在切换此状

我正在尝试实现一个自定义按钮来跟踪MKUserTrackingMode。我知道有一个mkUserTrackingBarButtonim,但是我不能使用它,因为我的按钮不在工具栏/导航栏中,所以我无法实现自己的逻辑

基本上,我想要与mkusertrackingbarbuttonite提供的逻辑相同的逻辑,但我在实现这一点时遇到了困难。基本上,如果在MKUserTrackingModeNone中并单击按钮,则移动到mkusertrackingmode并跟随动画。这就是我的问题所在,如果地图在切换此状态时设置了动画,我不希望用户能够进入下一个状态MKUserTrackingModeFollowWithHeading。IE用户必须等待地图动画完成,并且用户在地图视图中居中,才能移动到MKUSERTRACKINGMODE FOLLOWWITHHEADING状态。我的问题主要是试图检测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的转换实际上不会为地图设置动画,因为地图已经位于用户位置的中心。也就是说,我说我要用动画跟踪用户,所以我设置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。非常感谢。