Goo*_*rel 8 mapkit mkmapview ios
当用户在地图上放大或滚动时,我想连续更新我的UI,根据MKMapView.(不仅在滚动结束后,工作正常.)
我尝试了委托方法mapView:regionWillChangeAnimated:根据文档,"只要当前显示的地图区域发生变化就会调用.在滚动期间,可以多次调用此方法来报告地图位置的更新." http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
[self updateUIAcordingToMapViewRegionChange];
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这不起作用,因为文档似乎没有说实话.该方法仅在区域变化的最开始时调用一次.在滚动期间,当手指向下并四处移动时,永远不会再次调用该方法.
我能找到的关于这个问题的唯一帖子是由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];
}
Run Code Online (Sandbox Code Playgroud)
但这也行不通.来自计时器的所有方法调用都在滚动结束后立即执行.似乎滚动mapView阻止主线程或其他东西......
我也在stackoverflow上阅读了这篇文章,但遗憾的是并没有完全理解它: 监视MKMapView重绘事件 所以如果我的问题的解决方案确实存在于那个SO线程中,请告诉我,我试着深入研究它的细节.
我仍然希望我只是太愚蠢或太盲目无法找到正确的委托方法,并且非常感谢处理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
Run Code Online (Sandbox Code Playgroud)
另一种方法是在mapView中创建计时器:regionWillChangeAnimated并在mapView:regionDidChangeAnimated中使其无效.
归档时间: |
|
查看次数: |
2897 次 |
最近记录: |