Hledá se: Jak spolehlivě, konzistentně vyberte anotaci MKMapView

hlasů
29

Po zavolání MKMapView ‚s setCenterCoordinate: animovaný: metodou (bez animace), rád bych vyzvat selectAnnotation: animovaný: (s animací), aby se anotace vyskočí z nově středem špendlík.

Pro tuto chvíli jsem prostě sledovat mapViewDidFinishLoadingMap: a vyberte anotaci. Nicméně, toto je problematické. Například, tato metoda není volána, když není potřeba načíst další mapy. V těchto případech má anotace není vybrána.:(

Velmi dobře. Mohl bych to říkat ihned po nastavení souřadnic místo v centru. Ach, ale v tomto případě je možné, že tam je mapová data načíst (ale to ještě neskončila načítání). Já bych riskoval volat to příliš brzy, přičemž animace stává flekatá v nejlepším případě.

Tedy, pokud jsem správně pochopil, že to není otázka vědět, jestli moje souřadnic je vidět, protože je to možné zabloudit téměř screenful vzdálenosti a musí načíst nová mapová data. Spíše je to otázka, jak zjistit, jestli nová mapová data musí být naloženo, a pak podle toho jednat.

Nějaké nápady na to, jak toho dosáhnout, nebo jak jinak (spolehlivě) vyberte anotaci po re-centrování zobrazení mapy na souřadnici, kde to anotace životy?

Záchytné body ocenili - díky!

Položena 10/08/2009 v 20:53
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
36

Narazil jsem na stejný problém, ale našel to, co se jeví jako spolehlivé a rozumné řešení:

  1. Provádět delegáta metodu MapView: didAddAnnotationViews :. Když jsem se pokusil výběru poznámky přímo v metodě delegáta, popisku klesl s kolíkem! Který vypadal divné, a tak přidám mírné zpoždění půl vteřiny.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Vyberte výchozí anotace tak, jak byste očekávali, ale volat selectAnnotation: animovaný;

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

Zdá se, že selectAnnotation:animated:není volána za určitých podmínek. Srovnej s MKMapView dokumenty :

Pokud zadaný anotace není na obrazovce, a proto nemá spojený výhled anotace, tato metoda nemá žádný vliv.

Odpovězeno 16/02/2010 v 01:06
zdroj uživatelem

hlasů
7

Více konzistentní způsob, než s použitím fixní časový limit je naslouchat regionDidChangezpětné volání. Nastavte Souřadnice středu mapy na požadovaný anotaci, a když je volána metoda regionDidChange, pak ve středu vyberte poznámku, otevřete popisku.

Tady je trochu videa jsem se té věci běží náhodně mezi 5 kolíků.

Za prvé, goto centrum souřadnici anotace. Řekněme, že objekt anotace je pojmenován thePin.

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

Pak v regionDidChangemetodě, zvolte tuto poznámku.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Odpovězeno 12/11/2010 v 06:23
zdroj uživatelem

hlasů
4

No právě FYI, to je to, co doktoři říkají,

Pokud zadaný anotace není na obrazovce, a proto nemá spojený výhled anotace, tato metoda nemá žádný vliv.

Takže pokud chci zavolat setCenterCoordinate:animated:nebo setRegion:animated:a pak chci vybrat anotaci voláním, selectAnnotation:animated:se nedostanou vybrána anotace a popisku neobjeví beacause přesného stejného důvodu výše zmíněné dokumenty, tak jak to bude skvělé mít něco podobného, setCenterCoordinate:animated:ComletionBlockale není tam ..! Způsobem, že pracoval pro mě je jak je uvedeno níže,

 [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 vám dá dokončení bloku a můžete používat, že k výběru anotaci.

Odpovězeno 14/08/2013 v 06:43
zdroj uživatelem

hlasů
4

Co pracoval pro mě volá selectAnnotation:animated:z mapView:didAddAnnotationViews:metody:

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

Apple dokumentaci o stejný zde .

Všimněte si, že jsem měl jen jeden anotace na mapě, aby [[mapView annotations] lastObject]byl v pořádku pro mé účely. Váš se může lišit.

Odpovězeno 02/11/2009 v 19:44
zdroj uživatelem

hlasů
2

Měl jsem podobný problém. Byl jsem pomocí výchozí MKPinAnnotationView s animatesDrop: ANO. Poté, co jsem přidal anotace k MKMapView, jsem dělal to:

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

které v logice svého programu, by měl vybrat nejbližší anotaci. To nefungovalo. Zjistila jsem důvod: pohled anotace nebyla na obrazovce v době této vybrané výzvy, protože pin poklesu animace. Takže všechno, co jsem udělal, bylo nastavit časovač vteřinu později vyberte anotaci. Je to hack, ale funguje to. Nejsem si jistý, jestli to bude fungovat v každé situaci i když, například na 3G vs. 3GS. To by bylo lepší přijít na správnou funkci zpětného volání, aby ji v.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Odpovězeno 15/12/2009 v 18:49
zdroj uživatelem

hlasů
1

Zjistil jsem několik problémů se všemi řešeními, které jsem viděl na můj problém (chci vybrat poznámku, když jsem ji přidat z viewDidAppear):

  1. Použití mapView:didAddAnnotationViews:metody delegáta.

    To však není práce pro mě, protože v případě, že zadaný anotace není na obrazovce, a proto nemá spojený výhled anotace, tato metoda nemá žádný vliv.

  2. Použití mapViewDidFinishLoadingMap:metody delegáta.

    To však není práce pro mě a to buď proto, že mapa je nyní cache, takže tato metoda se nazývá pouze jednou poprvé.

Řešení:

John Blackburn byl velmi blízko, ale bez mapView:didAddAnnotationViews:způsobem. Jen říkám svůj vlastní selectAnnotation:způsob, než jsem přidat poznámku, se zpožděním:

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

A to je to, co dělám ve svém selectAnnotation:způsobu:

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

Testováno na dvou iPhone 3GS (IOS 5 a 6) a iPhone 5.

Odpovězeno 23/10/2012 v 09:31
zdroj uživatelem

hlasů
0

Byl jsem s podobnou potíž, ale ve skutečnosti není schopen provést tuto metodu pracovat vůbec, natož nejednotně.

Zde je to, co jsem našel práci. Možná, že to bude fungovat i pro vás: Jak aktivovat zobrazení popisku MKAnnotationView bez dotyku kolík?

Odpovězeno 24/08/2009 v 03:53
zdroj uživatelem

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