首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跟踪MKUserTrackingMode的自定义按钮

跟踪MKUserTrackingMode的自定义按钮
EN

Stack Overflow用户
提问于 2014-11-20 00:51:01
回答 2查看 1.1K关注 0票数 1

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

基本上,我想要与MKUserTrackingBarButtonItem提供的相同的逻辑,但是我很难实现这个逻辑。基本上,如果在MKUserTrackingModeNone和按钮被点击,移动到MKUserTrackingModeFollow动画。这就是我的问题所在,如果映射是动画的,同时切换此状态,我不希望用户能够进入下一个状态MKUserTrackingModeFollowWithHeading。IE用户必须等待地图动画完成,用户在地图视图中居中,才能移动到MKUserTrackingModeFollowWithHeading状态。主要是我的问题是试图检测什么时候地图视图是完成动画。

我已执行:

代码语言:javascript
复制
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    self.isTrackingAnimation = NO;
}

因此,当我的地图动画停止时,我设置了一个标志,以给我一个指示,我不再是动画。

我试图实现一种方法,该方法可以确定是否可以切换状态。

代码语言:javascript
复制
- (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。

想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-20 00:58:52

与其在按钮按下处理程序中设置self.isTrackingAnimation = YES;,不如实现委托方法regionWillChangeAnimated:并在那里设置标志。

票数 1
EN

Stack Overflow用户

发布于 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://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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27029854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档