Poszukiwany: Jak solidnie, konsekwentnie wybierz adnotację MKMapView

głosy
29

Po wywołaniu MKMapView „s setCenterCoordinate: animowany: metoda (bez animacji), chciałbym zadzwonić selectAnnotation: animowane: (z animacją) tak, że adnotacja wyskoczy z nowo środku pinezki.

Na razie, po prostu obserwować mapViewDidFinishLoadingMap: a następnie wybierz adnotację. Jest to jednak problematyczne. Na przykład, metoda ta jest wywoływana, gdy nie ma potrzeby, aby załadować dodatkowe dane mapy. W tych przypadkach, moja adnotacja nie jest zaznaczona.:(

Bardzo dobrze. Mogę nazwać to natychmiast po ustaleniu współrzędnych centrum zamiast. Ahh, ale w tym przypadku jest to możliwe, że nie jest dane map załadować (ale to nie jest jeszcze zakończony załadunek). Chciałbym zaryzykować nazywając ją zbyt szybko, a animacja staje się zawodny w najlepsze.

Tak więc, jeśli dobrze rozumiem, to nie jest kwestia wiedząc, czy mój współrzędnych jest widoczny, ponieważ jest możliwe, aby zboczyć prawie pełnoekranowa odległości i trzeba załadować nowe dane map. Raczej jest to kwestia wiedząc, czy nowe dane map musi być załadowany, a następnie działając odpowiednio.

Wszelkie pomysły, w jaki sposób to osiągnąć, lub jak inaczej (rzetelnie) wybierz adnotację po ponownym centrowanie widoku mapy na współrzędnych gdzie to życie adnotacji?

Wskazówki docenione - dzięki!

Utwórz 10/08/2009 o 20:53
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
36

Wpadłem na ten sam problem, ale okazało się to, co wydaje się być wiarygodny i rozsądnego rozwiązania:

  1. Wdrożenie z przekazanym metody MapView: didAddAnnotationViews :. Kiedy próbowałem wybierając adnotacji bezpośrednio w metodzie delegata, objaśnienie spadła z kołkiem! Które wyglądały dziwnie, więc dodaję niewielkie opóźnienie o pół sekundy.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Wybrać początkową adnotacji jak można się spodziewać, ale wzywającą selectAnnotation: animowane;

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

Wydaje się, że selectAnnotation:animated:nie jest nazywany w pewnych warunkach. Porównaj z docs MKMapView :

Jeśli określona adnotacja nie jest na ekranie, a zatem nie mają powiązanych widoku opisu, metoda ta nie ma żadnego wpływu.

Odpowiedział 16/02/2010 o 01:06
źródło użytkownik

głosy
7

Bardziej konsekwentny sposób niż za pomocą ustalonego limitu czasu jest słuchanie regionDidChangezwrotnego. Ustaw centrum współrzędnych mapy do pożądanej adnotacji, a gdy metoda regionDidChange nazywa, a następnie wybierz adnotację w centrum, aby otworzyć objaśnienie.

Oto trochę wideo wziąłem rzeczy działa losowo pomiędzy 5 szpilek.

Po pierwsze, goto centrum współrzędna adnotacji. Powiedzmy, że obiekt adnotacji jest nazwany thePin.

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

Następnie w regionDidChangemetodzie, należy wybrać tę notatkę.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Odpowiedział 12/11/2010 o 06:23
źródło użytkownik

głosy
4

No po prostu FYI, to co docs powiedzieć,

Jeśli określona adnotacja nie jest na ekranie, a zatem nie mają powiązanych widoku opisu, metoda ta nie ma żadnego wpływu.

Więc jeśli chcę zadzwonić setCenterCoordinate:animated:lub setRegion:animated:a następnie chcę wybrać adnotacji poprzez wywołanie, selectAnnotation:animated:, adnotacja nie zostanie wybrany, a objaśnienie nie pojawi beacause dokładnie tego samego powodu, o którym mowa powyżej w docs, więc tak to byłoby wspaniale mieć coś podobnego, setCenterCoordinate:animated:ComletionBlockale nie jest tam ..! Sposób, że pracował dla mnie jest jak poniżej,

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

To daje blok ukończenia i że można korzystać, aby wybrać adnotacji.

Odpowiedział 14/08/2013 o 06:43
źródło użytkownik

głosy
4

Co pracował dla mnie dzwoni selectAnnotation:animated:z mapView:didAddAnnotationViews:metodą:

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

Dokumentacja Apple na to samo tutaj .

Zauważ, że miałem tylko jeden adnotacji na mapie więc [[mapView annotations] lastObject]było w porządku do moich celów. Może się wahać.

Odpowiedział 02/11/2009 o 19:44
źródło użytkownik

głosy
2

Miałem podobny problem. I był przy użyciu domyślnego MKPinAnnotationView z animatesDrop: TAK. Po dodaniu adnotacji do MKMapView, robiłem to:

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

które w logice mojego programu, należy wybrać najbliższy adnotacji. To nie działa. Pomyślałem przyczynę: widok adnotacji nie było na ekranie w czasie tej rozmowy select, ponieważ animacji muche. Więc zrobiłem było ustawić czas, aby wybrać adnotację sekundę później. Jest to hack, ale działa. Nie jestem pewien, czy to będzie działać w każdej sytuacji, choć na przykład na 3G vs 3GS. Byłoby lepiej, aby dowiedzieć się odpowiednią funkcję zwrotną, aby umieścić go w.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Odpowiedział 15/12/2009 o 18:49
źródło użytkownik

głosy
1

Znalazłem kilka problemów ze wszystkimi rozwiązaniami widziałem mojego problemu (Chcę wybrać adnotację kiedy dodałem go z viewDidAppear):

  1. Stosując mapView:didAddAnnotationViews:metodę delegata.

    To nie działa na mnie, bo jeśli nie jest określona adnotacja na ekranie, a zatem nie mają powiązanych widoku opisu, metoda ta nie ma żadnego wpływu.

  2. Stosując mapViewDidFinishLoadingMap:metodę delegata.

    To nie dla mnie, albo dlatego, że mapa jest buforowane teraz, więc metoda jest wywoływana tylko raz, po raz pierwszy.

Rozwiązanie:

John Blackburn był bardzo blisko, ale bez mapView:didAddAnnotationViews:metody. Ja po prostu zadzwonić własną selectAnnotation:metodę, zanim dodam adnotację, z opóźnieniem:

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

I to jest to, co robię w moim selectAnnotation:metody:

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

Testowany na dwóch iPhone 3G (OI 5 i 6), iPhone 5.

Odpowiedział 23/10/2012 o 09:31
źródło użytkownik

głosy
0

Miałam podobną trudność, ale faktycznie nie był w stanie wykonać tej pracy metoda w ogóle, nie mówiąc już niekonsekwentnie.

Oto co znalazłem do pracy. Może to będzie pracować dla Ciebie: Jak wyzwalać MKAnnotationView za objaśnienia widok bez dotykania pin?

Odpowiedział 24/08/2009 o 03:53
źródło użytkownik

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