ios - 是否可以在滚动/缩放时连续跟踪 MKMapView 区域?

标签 ios mkmapview mapkit

当用户缩放或滚动 map 时,我想根据 MKMapView 不断更新我的 UI。 (不仅在滚动结束后,效果很好。)

我尝试了委托(delegate)方法 mapView:regionWillChangeAnimated:,根据文档,“只要当前显示的 map 区域发生变化,就会调用该方法。在滚动期间,可能会多次调用此方法来报告 map 位置的更新。” https://developer.apple.com/documentation/mapkit/mkmapviewdelegate

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    [self updateUIAcordingToMapViewRegionChange];
}

但不幸的是,这不起作用,因为文档似乎没有说实话。该方法仅在区域更改开始时调用一次。在滚动期间,当手指向下移动时,不会再次调用该方法。

我能找到的关于这个问题的唯一帖子是 macrumors 成员 namanhams: http://forums.macrumors.com/showthread.php?t=1225172 但是没有人提出任何想法......

作为一种解决方法,我尝试在 regionWillChange 中设置一个计时器(并在 regionDidChange 中使其无效):

- (void)handleRegionChange:(NSTimer*)timer
{
   [self updateUIAcordingToMapViewRegionChange];
} 

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    self.mapRegionIsChangingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                    target:self
                                                  selector:@selector(handleRegionChange:)
                                                  userInfo:nil
                                                   repeats:YES];
}

但这也行不通。滚动结束后立即执行所有来自计时器的方法调用。好像滚动 mapView 阻塞了主线程之类的……

我也在stackoverflow上看了这篇帖子,可惜没完全看懂: Monitor MKMapView redraw events 因此,如果我的问题的解决方案确实存在于该 SO 线程中,请告诉我,我将尝试深入研究它的细节。

我仍然希望我只是太愚蠢或太盲目而无法找到正确的委托(delegate)方法,并且非常感谢处理 MKMapView 区域跟踪的任何提示、解决方法和最佳实践。

最佳答案

这会起作用:

@interface MapViewController () {
    NSTimer *_updateUITimer;
}

@end

@implementation MapViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    _updateUITimer = [NSTimer timerWithTimeInterval:0.1 
                                             target:self 
                                           selector:@selector(updateUI) 
                                           userInfo:nil 
                                            repeats:YES];

    [[NSRunLoop mainRunLoop] addTimer:_updateUITimer forMode:NSRunLoopCommonModes];

}

- (void)dealloc
{
    [_updateUITimer invalidate];
}

- (void)updateUI
{
    // Update UI
}

@end

另一种方法是在 mapView:regionWillChangeAnimated 中创建计时器并在 mapView:regionDidChangeAnimated 中使其无效。

关于ios - 是否可以在滚动/缩放时连续跟踪 MKMapView 区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10796058/

相关文章:

ios - Firebase 查询数组

iphone - 单击 DetailDesclosure 按钮时 MKAnnotationView 推送到 View Controller

iphone - 在缩放之后/期间更新 AnnotationView

swift4 - 倒圆图填充swift 4

mapkit - 如何判断 CLLocationManager 是否正在监视重大位置更改

iphone - 如何在 iOS 中设置 Effect Audio Unit

objective-c - 为什么我更改标签文本的 IBAction 不起作用?

swift - 从 setUserTrackingMode(.Follow, animated : true)

ios - 如何渲染复合 MKOverlay

ios - 将字符串从 TableView 单元格传递到 Swift 3 中的 View Controller