2013-10-26 17 views
9

MKMapView ve MKMapCamera ile çalışırken garip davranışları farkettim. Apple Maps uygulamasının bazı standart davranışlarını uygulamam gerekiyor. Temel olarak, ihtiyacım olan şey Harita Görünümü kullanıcı izleme modu MKUserTrackingModeFollowWithHeading olarak ayarlandığında 2D ve 3D modları arasında geçiş yapabilmektir. (: Animasyonlu: EVET veya HAYIR ben setCamera bakılmaksızın olur) userTrackingMode MKUserTrackingModeNone olarak ayarlandığında MKMapCamera öğesini MKUserTrackingModeFollowWithHeading modu modunda ayarlarken garip MKMapView davranışı

Şu anda, benim çözüm çalışıyor ancak diğer modlarda garip animasyon yapar. Fotoğraf makinesinin parametrelerini yeni ayarlanmadan hemen önce ve sonra kaydettiğimde, tek fark adım adım değişmem.

Başka bir sorun, programın yakınlaştırılması veya uzaklaştırılması için makinenin yüksekliğini değiştirmektir. Ben IBAction yönteminde çimdikleme ya da dışarı hareketi ile yakınlaştırma taklit etmeye çalışıyorum. followWithHeadingMode haritasında her zaman "varsayılan" zum seviyesine (kameranın rakımı) döner, diğer modlarda ise harika çalışır.

Ben neler olduğunu kontrol etmek için örnek proje başladı ve sorun oluştuğunda nerede harita görüntüsü benim tek görünüm uygulamanın görünümü denetleyicisi var: Ne aradığım Apple Haritalar uygulamasına benzer bir davranıştır

#import "CCViewController.h" 

@interface CCViewController() 
@end 

@implementation CCViewController 

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
} 

- (void)setUpMap{ 
    [self.mapView setShowsUserLocation: YES]; 
} 

- (void)viewDidAppear:(BOOL)animated{ 
    [self setUpMap]; 
} 

- (IBAction)mapModeSwitchClicked:(id)sender { 
    MKMapCamera *newCamera = [MKMapCamera camera]; 
    newCamera.centerCoordinate = self.mapView.camera.centerCoordinate; 
    newCamera.heading = self.mapView.camera.heading; 
    newCamera.altitude = self.mapView.camera.altitude; 

    if(!self.mapView.camera.pitch){ 
     newCamera.pitch = 50; 
     self.mapModeSwitch.title = @"2D"; 
    } 
    else{ 
     newCamera.pitch = 0; 
     self.mapModeSwitch.title = @"3D"; 
    } 

    [self.mapView setCamera:newCamera animated:YES]; 
} 

- (IBAction)locateMeButtonClicked:(id)sender { 

     if(self.mapView.userTrackingMode != MKUserTrackingModeFollowWithHeading) 
      [self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES]; 
     else 
      [self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES]; 
} 

- (void)zoomMapWithZoomFactor:(double)factor{ 
    MKMapCamera *newCamera = [MKMapCamera camera]; 
    newCamera.pitch = self.mapView.camera.pitch; 
    newCamera.heading = self.mapView.camera.heading; 
    newCamera.altitude = self.mapView.camera.altitude * factor; 
    newCamera.centerCoordinate = self.mapView.camera.centerCoordinate; 

    [self.mapView setCamera:newCamera animated:YES]; 
} 

- (IBAction)zoomInClicked:(id)sender { 
    [self zoomMapWithZoomFactor: 0.5]; 
} 

- (IBAction)zoomOutClicked:(id)sender { 
    [self zoomMapWithZoomFactor: 2]; 
} 


@end 

. Herhangi bir fikrin var mı? Neyi yanlış yapıyorum ?

+0

, bu hala gerçekleşir. – Claus

cevap

5

Bu, MapKit'te bir hata olduğuna inanıyorum. MKUserTrackingModeFollowWithHeading etkinken programatik yakınlaştırma ile benzer gözlemler yaptım: Harita kısa bir süre uzaklaşıyor, ancak bir sonraki konum güncellemesini alır almaz bir önceki yakınlaştırma seviyesine geri dönüyor.

Bkz. rdar://15374402 (MapKit: UserTracking sırasında programatik yakınlaştırma) ve rdar://15374604 (MKUserTrackingModeFollow, kenarda ek açıklama seçimini yasaklar).

Tavsiyem: MKUserTrackingModeFollow ve MKUserTrackingModeFollowWith'i kullanarak, görüntülenen harita bölgesinde programatik denetim istediğiniz sürece kaldırın.

+1

Apple'la da bir hata raporu gönderdim, oldukça sinir bozucu bir böcek. Olası bir fikrim var. Tek bir konum yöneticim var ve CLLocationManagerDelegate kullanıyorum, konum güncellemelerine abone olmak ve her seferinde MKCamera ile haritayı ortalamak için NSNotifications kullanıyorum. Bu şekilde, zoom'u kontrol edebilir ve haritayı kullanıcıya yerleştirebilirsiniz. – barndog

+1

Elbette, benzer bir geçici çözüm yapıyorum. Yine de aynı UX değil. Kaydırma bu kadar pürüzsüz değildir (çünkü animasyon süresini ayarlayamayız), pusula rotasyonunu manuel olarak gerçekleştirirken harita rotasyonu yoktur. –

+1

Evet gerçekten sinir bozucu. elma onların oyuna girmesi gerekiyor. – barndog

0

iOS9 güncelleme:

Bu aynı etkiye sahiptir:

"irtifa biraz uzaklaştırıldığında" ama *animated:YES*

kullanırken bu etki sadece oluyor zaman

[self.mapView setCamera:newCamera animated:NO]; 

değil 2017 yılı itibariyle