Wanted: Hogyan kell megbízhatóan, következetesen ki egy MKMapView kommentár

szavazat
29

Miután felhívta MKMapView „s setCenterCoordinate: animált: eljárás nélkül (animáció), szeretném felhívni selectAnnotation: animált: (animáció), hogy a kommentár kiugrik az újonnan központú rajzszög.

Egyelőre én csak nézni a mapViewDidFinishLoadingMap: majd válassza ki a kommentár. Ez azonban problematikus. Például, ez a módszer nem hívják, amikor nincs szükség betöltéséhez további térkép adatokat. Azokban az esetekben, időjelzésemhez nincs kiválasztva.:(

Nagyon jól. Nevezhetném ezt beállítása után közvetlenül a központban koordináta helyett. Ahh, de ebben az esetben lehetséges, hogy ott van térkép adatok betöltése (de még nem fejeződött be még). Én kockázatot nevezni túl hamar, az animációs egyre foltos a legjobb.

Tehát ha jól értem, ez nem egy kérdés, hogy tudjuk, ha a koordináta látható, mivel lehetséges, hogy kóbor szinte görgetés távolság, és betölteni az új térkép adatokat. Inkább ez egy kérdés, hogy tudjuk, ha az új térkép adatokat kell betölteni, majd ennek megfelelően kell eljárni.

Van ötleted, hogyan kell ezt, vagy hogyan másképp (megbízhatóan), válasszon egy kommentár után újra központosító térkép nézetben a koordináta, ahol ez kommentár életét?

Nyomok értékelik - köszönöm!

A kérdést 10/08/2009 20:53
a forrás felhasználó
Más nyelveken...                            


7 válasz

szavazat
36

Futottam ugyanaz a probléma, de nem talált, amit úgy tűnik, mint egy megbízható és ésszerű megoldást:

  1. Végre kell hajtani a küldött módszer mapView: didAddAnnotationViews :. Amikor megpróbáltam adja meg a kommentár közvetlenül a küldött módszer, a kiemelő esett a csap! Ez furcsának, úgyhogy hozzá egy kis késés egy fél másodperc.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Válassza ki az első kommentár ahogy az elvárható, de hív selectAnnotation: animációs;

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

Úgy tűnik, hogy selectAnnotation:animated:nem hívják bizonyos feltételek mellett. Hasonlítsuk össze MKMapView docs :

Ha a megadott kommentár nem a képernyőn, és ezért nem rendelkezik társított kommentár szerint ez a módszer nem befolyásolja.

Válaszolt 16/02/2010 01:06
a forrás felhasználó

szavazat
7

Egy következetes módon, mint egy fix timeout hallgatni a regionDidChangevisszahívás. Állítsa be a középső koordinátáját a térképen a kívánt feliratozást, és amikor a regionDidChange módszert nevezik, majd válassza ki a kommentár a központban, hogy nyissa meg a tételt.

Itt egy kis videó vettem a dolgot futó véletlenszerűen között 5 csapokat.

Először is, goto a központ koordinálja, amely a kommentár. Tegyük fel, hogy a kommentár objektum neve thePin.

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

Aztán a regionDidChangemódszert válassza ezt a jelölést.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Válaszolt 12/11/2010 06:23
a forrás felhasználó

szavazat
4

Hát csak FYI, ez az, amit a docs mondani,

Ha a megadott kommentár nem a képernyőn, és ezért nem rendelkezik társított kommentár szerint ez a módszer nem befolyásolja.

Tehát ha akarom hívni setCenterCoordinate:animated:, vagy setRegion:animated:majd én szeretném kiválasztani a kommentár hívja, selectAnnotation:animated:a bejegyzést nem fog kiválasztani és a kiemelő nem fog megjelenni beacause pontosan ugyanolyan fent említett okok miatt a docs, így az út lenne jó, hogy van valami hasonló, setCenterCoordinate:animated:ComletionBlockde nem volt ott ..! Az utat, hogy nekem dolgozott az alábbiak szerint,

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

Ez ad egy teljesítési blokk és u tud használni, hogy válassza ki a kommentár.

Válaszolt 14/08/2013 06:43
a forrás felhasználó

szavazat
4

Mi már dolgozott nekem hívta selectAnnotation:animated:a mapView:didAddAnnotationViews:módszer:

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

Apple dokumentáció ugyanazon ide .

Vegye figyelembe, hogy én csak az egyik volt magyarázat a térképen, hogy [[mapView annotations] lastObject]jó volt az én célra. A kilométeróra változhat.

Válaszolt 02/11/2009 19:44
a forrás felhasználó

szavazat
2

Én volt egy hasonló probléma. Én az alapértelmezett MKPinAnnotationView a animatesDrop: IGEN. Miután felvette a kommentárok a MKMapView, én ezt:

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

amely a logika a programom, ki kell választania a legközelebbi kommentár. Ez nem működött. Rájöttem az oka: a megjegyzés volt a véleménye, nem látható a képernyőn idején ezt válasszuk hívást, mert a döngését animáció. Tehát minden, amit tettem volt időzítő beállításához válassza ki a kommentár egy másodperccel később. Ez egy hack, de működik. Nem vagyok biztos abban, hogy jó lesz minden helyzetben azonban, például a 3G 3GS vs. Jobb lenne kitalálni a megfelelő callback függvényt betette.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Válaszolt 15/12/2009 18:49
a forrás felhasználó

szavazat
1

Azt találtuk, több probléma is felmerül az összes megoldást láttam az én bajom (én szeretném kiválasztani a kommentár, amikor hozzáadjuk azt viewDidAppear):

  1. A mapView:didAddAnnotationViews:delegált módszer.

    Ez nem működik nekem, mert ha a megadott kommentár nem a képernyőn, és ezért nem rendelkezik társított kommentár szerint ez a módszer nem befolyásolja.

  2. A mapViewDidFinishLoadingMap:delegált módszer.

    Ez nem működik nekem sem, mert a térkép cache most, így a metódus neve csak egyszer, az első alkalommal.

Megoldás:

John Blackburn nagyon szoros volt, de anélkül, hogy a mapView:didAddAnnotationViews:módszer. Én csak hívja a saját selectAnnotation:módszerrel, mielőtt hozzá a kommentár, a késedelem:

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

És ez az, amit én cselekszem az én selectAnnotation:módszer:

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

Teszteltünk két iPhone 3GS (IOS 5 és 6) és egy iPhone 5.

Válaszolt 23/10/2012 09:31
a forrás felhasználó

szavazat
0

Én volt hasonló nehézségű, de valójában nem tudja, hogy ezt a módszert egyáltalán, nemhogy következetlenül.

Itt van, amit találtam, hogy működik. Lehet, hogy működni fog az Ön számára is: Hogyan kiváltó MKAnnotationView a kiemelő véli, hogy ne érjen a csapot?

Válaszolt 24/08/2009 03:53
a forrás felhasználó

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