2012-05-29 33 views
8

Kullanıcı, haritayı yakınlaştırdığında veya kaydırdığında, UI'm sürekli olarak MKMapView'a göre güncellemek istiyorum. (Sadece kaydırma bittikten sonra, bu işe yaramaz.)Kaydırma/yakınlaştırma yaparken MKMapView bölgesini sürekli takip etmek mümkün mü?

Temsilci yöntemini denedim mapView: regionWillChangeAnimated: Bu belgeye göre, şu anda görüntülenen harita bölgesinin her değiştiğinde çağrılır. Harita konumuna güncellemeleri bildirmek için birçok kez çağrılabilir. " dokümantasyon doğruyu söylüyor varılmamış görünüyor çünkü http://developer.apple.com/library/ios/#DOCUMENTATION/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html

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

Ama ne yazık ki bu çalışmıyor. Yöntem, bölge değişiminin en başında yalnızca bir kez çağrılır. Kaydırma sırasında, parmak aşağı ve hareket ederken, yöntem bir daha asla çağrılmaz.

bulabildiğim bu sorun hakkında sadece post MacRumors üye namanhams tarafından yapıldı: http://forums.macrumors.com/showthread.php?t=1225172 Ama kimse herhangi fikirler geliştirdim ... Ben regionWillChange bir zamanlayıcı kurma çalıştı Çözüm olarak

(ve geçersiz o bölgedeDDChange):

- (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]; 
} 

Fakat bu da işe yaramıyor. Zamanlayıcının tüm yöntem çağrıları, kaydırma bittikten hemen sonra bir defada gerçekleştirilir.

Ben de stackoverflow bu yazı okumak ... ana iş parçacığı ya da bir şey engelliyor MapView kaydırma gibi görünüyor, ama ne yazık ki tamamen anlamadı: Monitor MKMapView redraw events Yani benim sorunun çözümü o gerçekten de yatıyor eğer SO iş parçacığı, lütfen söyle, ben de ayrıntılarına girmeye çalışıyorum.

Yine de doğru delegeler yöntemini bulmak için çok aptal ya da çok kör olduğumu umuyorum ve MKMapView bölge takibi ile başa çıkmak için tüm ipuçlarını, çözümleri ve en iyi uygulamaları gerçekten takdir ediyorum.

Teşekkürler! Bir başka yolu MapView zamanlayıcıyı yaratıyor

@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 

:

cevap

9

Bu çalışacaktır regionWillChangeAnimated ve MapView bunu geçersiz: regionDidChangeAnimated.

+1

Teşekkürler! Kendimi denediğimin tam olarak bu olduğunu düşündüm (yukarıdaki ikinci kod parçacığına bakın). Yanlış yaptığım şey: Zamanlayıcıyı bir özellikte sakladım, ancak kod snippet'imden farklı olarak ('daha kısa ve daha net hale getirmek için değiştim'), yalnızca örnek değişkeni nil değilse, bunu alıcıda oluşturuyordum. Ama zamanlayıcı geçersiz kılma özelliği sıfırlamaz, bu yüzden her zaman mapView bölgeyi değiştirdiğinde runloop eski bir geçersiz kronometre ekleyerek oldu sanırım ... – Goodsquirrel

İlgili konular