用于跟踪MKUserTrackingMode的自定义按钮

时间:2014-11-20 00:51:02

标签: ios mkmapview mapkit

我正在尝试实现自定义按钮来跟踪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。

想法?

2 个答案:

答案 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

具体观看地图视图:

https://github.com/mapbox/mapbox-ios-sdk/blob/509fa7df46ebd654d130ab2f530a8e380bf2bd59/MapView/Map/RMUserTrackingBarButtonItem.m#L153-L155

采取行动改变:

https://github.com/mapbox/mapbox-ios-sdk/blob/509fa7df46ebd654d130ab2f530a8e380bf2bd59/MapView/Map/RMUserTrackingBarButtonItem.m#L177