2012-05-29 61 views
8

當用戶放大或滾動地圖時,我想繼續根據MKMapView更新我的用戶界面。 (不僅在滾動結束後,工作正常。)是否可以在滾動/縮放的同時連續跟蹤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]; 
} 

但不幸的是,這並不工作,因爲文件似乎並沒有被告知真相。該方法僅在區域更改開始時調用一次。在滾動期間,當手指向下並移動時,該方法不會再被調用。

關於這個問題,我能找到的唯一的職務是由加拿大家園成員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阻塞主線程或東西...

我也讀計算器這個職位,但遺憾的是沒有完全理解它: Monitor MKMapView redraw events 因此,如果解決我的問題在於確實在SO-線程,請告訴我,我試圖挖掘它的細節。

我仍然希望我太愚蠢或太盲目,找不到正確的委託方法,並且非常感謝處理MKMapView區域跟蹤的任何提示,解決方法和最佳實踐。

謝謝!

回答

9

這將工作:

@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 

另一種方式是創建在圖形頁面計時器:regionWillChangeAnimated並在圖形頁面而無效:regionDidChangeAnimated。

+1

謝謝!我認爲這正是我自己嘗試的(見上面的第二個代碼片段)。我做錯了什麼是:我將計時器存儲在一個屬性中,但與我的代碼片段(我更改爲「更短更清晰」)不同,我只是在實例變量不爲零的情況下才在getter中創建它。但是無效的計時器不會將屬性設置爲零,所以我想我總是在我的mapView改變區域時向runloop添加一箇舊的無效計時器... – Goodsquirrel