Aranıyor: güvenilir, tutarlı bir MKMapView ek açıklama seçmek için nasıl

oy
29

Sonra arama MKMapView 'ın animasyonlu: setCenterCoordinate yöntemi (animasyon olmayan), ben aramak isterim selectAnnotation: animasyonlu açıklama yeni merkezli raptiye dışarı fırlar (animasyon ile) olacak şekilde.

Şimdilik, sadece izlemek mapViewDidFinishLoadingMap: ve ardından ek açıklamayı seçin. Ancak bu problemlidir. Ek harita verilerini yüklemek gerek yokken Örneğin, bu yöntem çağrılmaz. Bu gibi durumlarda, benim ek açıklama seçilmedi.:(

Çok iyi. Ben hemen merkezi yerine koordinat ayarladıktan sonra bu diyebiliriz. Ahh, ama bu durumda orada olması mümkündür olduğunu harita veri yüklemek için (ancak henüz yüklemeyi bitirmedi). Ben animasyon en iyi sivilceli olma ile, çok yakında çağırarak riske ederdim.

Doğru anladıysam eğer mesafenin neredeyse bir screenful başıboş ve yeni harita verilerini yüklemek için olması mümkündür çünkü benim koordinat, görünür ise Dolayısıyla, bu bilmenin meselesi değil. Aksine, bu yeni harita verisi yüklenmesi gerekiyorsa bilerek ona göre hareket meselesi.

Bunu gerçekleştirmek için nasıl bir fikir, ya da ne kadar aksi (güvenilir) yeniden merkezleme nerede açıklama hayatlarını koordinat harita görünümü sonra ek açıklama seçmek için?

İpuçları takdir - teşekkür!

Oluştur 10/08/2009 saat 20:53
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
36

Ben aynı sorun koştu, ancak güvenilir ve makul bir çözüm gibi görünüyor bulundu:

  1. temsilci yöntemi MapView uygulanması: didAddAnnotationViews :. Ben temsilci yönteminin içinde doğrudan ek açıklama seçerek çalıştığında, çizgisi pimi ile düştü! Garip görünüyordu, bu yüzden yarım saniyenin küçük bir gecikme ekleyin.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. beklediğiniz gibi ilk ek açıklama, ancak arama selectAnnotation seçin: animasyonlu;

    -(void)selectInitialAnnotation {
        [self.mapView selectAnnotation:self.initialAnnotation animated:YES];
    }
    

Gibi görünüyor selectAnnotation:animated:bazı şartlar altında çağrılmaz. Ile karşılaştırın MKMapView docs :

Belirtilen açıklama ilişkili bir açıklama manzarasına sahip değildir, bu nedenle ekrandaki değildir ve varsa, bu yöntem hiçbir etkisi olmaz.

Cevap 16/02/2010 saat 01:06
kaynak kullanıcı

oy
7

Sabit bir zaman aşımı kullanmaktan daha daha tutarlı bir yoldur dinlemektir regionDidChangecallback'inde. Merkezi istenen ek açıklama için harita koordinatı ayarlayın ve regionDidChange yöntemi çağrıldığında, daha sonra ek bilgiyi açmak için, merkezi olarak açıklamayı seçmek.

İşte küçük olduğunu Video Ben 5 pin arasında rastgele çalışan şey aldı.

İlk olarak, merkez açıklama koordinatı gidiniz. Ek açıklama nesnesi olarak adlandırılır varsayalım thePin.

- (void)someMethod {
    [map setCenterCoordinate:thePin.coordinate animated:YES];
}

Sonra içinde regionDidChangeyöntemle, bu açıklamayı seçmek.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Cevap 12/11/2010 saat 06:23
kaynak kullanıcı

oy
4

Peki sadece Bilginize, bu dokümanlar böyle düşünürler

Belirtilen açıklama ilişkili bir açıklama manzarasına sahip değildir, bu nedenle ekrandaki değildir ve varsa, bu yöntem hiçbir etkisi olmaz.

Ben aramak istiyorsanız Yani setCenterCoordinate:animated:ya setRegion:animated:ve sonra arayarak açıklamayı seçmek istiyorum selectAnnotation:animated:, ek açıklama seçilmiş yapılmaz ve çizgisi dokümanlarında yukarıda bahsedilen tam aynı nedenden beacause görünmez Yani yolu olurdu Büyük gibi bir şey var, hiç setCenterCoordinate:animated:ComletionBlockonun değil orada ama ..! Benim için çalıştı yolu aşağıdaki gibidir

 [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionBeginFromCurrentState|UIViewAnimationOptionCurveEaseInOut animations:^{
        [self.mapView setCenterCoordinate:location.coordinate animated:YES];
    } completion:^(BOOL finished) {
        [self.mapView selectAnnotation:location animated:YES];
    }];

Bu size bir tamamlama bloğu verecek ve u açıklamayı seçmek için kullanabilirsiniz.

Cevap 14/08/2013 saat 06:43
kaynak kullanıcı

oy
4

Ne beni çağırıyordu için çalışmıştır selectAnnotation:animated:gelen mapView:didAddAnnotationViews:yöntemiyle:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
{
    [mapView selectAnnotation:[[mapView annotations] lastObject] animated:YES];
}

Aynı Apple belgelerine burada .

Ben sadece harita üzerinde bir açıklama yüzden vardı unutmayın [[mapView annotations] lastObject]benim için iyi oldu. Sizin kilometre değişebilir.

Cevap 02/11/2009 saat 19:44
kaynak kullanıcı

oy
2

Ben benzer bir sorun yaşıyordu. Ben animatesDrop varsayılan MKPinAnnotationView kullanıyordu: EVET. Ben MKMapView için ek açıklamaları eklendi sonra ben bunu yapıyordum:

[mapView selectAnnotation:[mapView.annotations objectAtIndex:1] animated:YES]

hangi programımın mantığında, en yakın ek açıklama seçmelidir. Bu çalışma değildi. Nedenini anladım: ek açıklama görünümü nedeniyle PIN açılan animasyon Bunun seçkin çağrının anda ekranda değildi. Yani tüm yaptığım bir saniye sonra ek açıklama seçmek için bir zamanlayıcı ayarlandı. Bu bir hack var, ama işe yarıyor. Ben 3Gs vs bir 3G örneğin olsa her durumda çalışması olacak emin değilim. Koymak doğru geri çağırma işlevi anlamaya daha iyi olurdu.

selectTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self
               selector:@selector(selectClosestAnnotation) userInfo:nil
               repeats:NO];

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Cevap 15/12/2009 saat 18:49
kaynak kullanıcı

oy
1

Benim problem (I viewDidAppear onu eklendiğinde bir ek açıklama seçmek için istiyorum) için gördüğümüz bütün çözümleri ile çeşitli sorunlar tespit ettik:

  1. Kullanılması mapView:didAddAnnotationViews:temsilci yöntemi.

    Bu, bu yöntemin bir etkisi yoktur, ilişkili bir açıklama manzarasına sahip değildir, bu nedenle belirtilen açıklama ekran değilse çünkü benim için çalışmak ve vermedi.

  2. Kullanılması mapViewDidFinishLoadingMap:temsilci yöntemi.

    Harita artık önbelleğe alınır ya çünkü yöntem yalnızca bir kez denir böylece bu, benim için ilk kez işe yaramadı.

Çözüm:

John Blackburn çok yakın ama idi mapView:didAddAnnotationViews:yöntemle. Ben sadece kendi çağrı selectAnnotation:ben gecikmeyle, ek açıklama eklemeden önce, yöntem:

[self.mapView addAnnotation:ann];
[self performSelector:@selector(selectAnnotation:) withObject:ann afterDelay:0.5];

Ve bu benim yapması gereken şeydir selectAnnotation:yöntemle:

- (void)selectAnnotation:(id < MKAnnotation >)annotation
{
   [self.mapView selectAnnotation:annotation animated:YES];
}

İki 3GS (IOS 5 ve 6) ve bir iPhone 5 üzerinde test edilmiştir.

Cevap 23/10/2012 saat 09:31
kaynak kullanıcı

oy
0

Ben benzer zorluk, ama aslında, tüm bu yöntem işe yaraması tutarsız dursun mümkün değildi.

İşte işe ne bulunur. : Belki çok sizin için çalışacaktır nasıl pimi dokunmadan MKAnnotationView en çizgisi görünümü tetiklemek için?

Cevap 24/08/2009 saat 03:53
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more