Требуются: Как надежно, последовательно выберите аннотацию MKMapView

голоса
29

После вызова MKMapView «s setCenterCoordinate: анимированные: метод (без анимации), я хотел бы назвать selectAnnotation: анимированные: (с анимацией) , так что аннотацию выскакивает из недавно центрированной Pushpin.

На данный момент я просто наблюдать за mapViewDidFinishLoadingMap: а затем выберите аннотацию. Тем не менее, это проблематично. Например, этот метод не вызывается , когда нет необходимости загружать дополнительные данные карты. В тех случаях, мой аннотации не выбраны.:(

Очень хорошо. Я мог бы назвать это сразу же после установки центра координат вместо. Ааа, но в этом случае вполне возможно , что там есть картографические данные для загрузки (но не закончили загрузку еще). Я бы рискну назвать его слишком рано, с анимация становится пятнистой в лучшем случае .

Таким образом, если я правильно понимаю, это не вопрос знания , если моя координата видно, так как можно отклониться почти экранное расстояние и придется загружать новые данные карты. Скорее всего , это вопрос зная, нужны новые данные карты должны быть загружены, а затем действовать соответственно.

Любые идеи о том, как это сделать, или как в противном случае (надежно) выберите аннотацию после повторного центрирования вида карты на координату, где это аннотации жизни?

Улики оценили - спасибо!

Задан 10/08/2009 в 20:53
источник пользователем
На других языках...                            


7 ответов

голоса
36

Я столкнулся с той же проблемой, но обнаружил, что кажется надежным и разумным решением:

  1. Реализовать метод делегата MAPview: didAddAnnotationViews :. Когда я попытался выбрать аннотацию непосредственно в делегат метода, выноска упала с булавкой! Это выглядело странно, так что я добавить небольшую задержку в полсекунды.

    -(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
        [self performSelector:@selector(selectInitialAnnotation)
              withObject:nil afterDelay:0.5];
    }
    
  2. Выберите начальную аннотацию, как можно было бы ожидать, но призывающую selectAnnotation: анимированные;

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

Кажется , что selectAnnotation:animated:не вызывается при некоторых условиях. Сравните с MKMapView документы :

Если указанная аннотацию не на экране, и, следовательно, не имеет соответствующий вида аннотаций, этот метод не имеет никакого эффекта.

Ответил 16/02/2010 в 01:06
источник пользователем

голоса
7

Более последовательный способ , чем при использовании фиксированного таймаута, чтобы слушать regionDidChangeобратный вызов. Установить координаты центра карты до нужной аннотации, и когда метод regionDidChange называется, затем выберите аннотацию в центре, чтобы открыть выноски.

Вот немного видео я взял вещь работает случайным образом между 5 штырей.

Во- первых, Гото центр координату аннотацию. Допустим, объект аннотацию называется thePin.

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

Затем в regionDidChangeметоде, выберите эту аннотацию.

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    [map selectAnnotation:thePin animated:YES];
}
Ответил 12/11/2010 в 06:23
источник пользователем

голоса
4

Ну просто FYI, это то, что говорят документы,

Если указанная аннотацию не на экране, и, следовательно, не имеет соответствующий вида аннотаций, этот метод не имеет никакого эффекта.

Так что, если я хочу , чтобы позвонить setCenterCoordinate:animated:или setRegion:animated:и то я хочу , чтобы выбрать аннотацию по телефону, selectAnnotation:animated:, аннотацию не будет выбран и сносками не появится обусловленно той же самой причине , указанной выше в документации, так как это было бы здорово иметь что - то вроде, setCenterCoordinate:animated:ComletionBlockно его нет! .. Путь , который работал для меня, как показано ниже,

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

Это даст вам блок завершения, и вы можете использовать, чтобы выбрать аннотацию.

Ответил 14/08/2013 в 06:43
источник пользователем

голоса
4

То , что работало для меня звали selectAnnotation:animated:от mapView:didAddAnnotationViews:метода:

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

Apple , документация на тот же здесь .

Обратите внимание , что у меня был только один аннотация на карте так [[mapView annotations] lastObject]была хороша для моих целей. Ваш пробег может варьироваться.

Ответил 02/11/2009 в 19:44
источник пользователем

голоса
2

У меня была аналогичная проблема. Я использовал MKPinAnnotationView по умолчанию с animatesDrop: YES. После того, как я добавил аннотацию к MKMapView, я делаю это:

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

которая в логике моей программы, следует выбрать ближайшую аннотацию. Это не работает. Я выяснил причину: вид аннотаций не был на экране в момент этого выбора вызова из-за падение контактного анимации. Так что все, что я сделал был установлен таймер, чтобы выбрать аннотацию секундой позже. Это хак, но это работает. Я не уверен, если он будет работать в любой ситуации, хотя, например, на 3G против 3Gs. Было бы лучше, чтобы выяснить правильную функцию обратного вызова, чтобы положить его в.

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

- (void)selectClosestAnnotation {
    [mapView selectAnnotation:[mapView.annotations objectAtIndex:1]
             animated:YES];
}
Ответил 15/12/2009 в 18:49
источник пользователем

голоса
1

Я нашел несколько проблем со всеми решениями, которые я видел в моей проблеме (я хочу, чтобы выбрать аннотацию, когда я добавил его от viewDidAppear):

  1. Используя mapView:didAddAnnotationViews:метод делегата.

    Это не работает для меня, потому что, если указанная аннотацию не на экране, и, следовательно, не имеет соответствующего вид аннотаций, этот метод не имеет никакого эффекта.

  2. Используя mapViewDidFinishLoadingMap:метод делегата.

    Это не работает для меня либо потому, что карта кэшируется сейчас, поэтому метод вызывается только один раз, в первый раз.

Решение:

Джон Блэкберн был очень близко , но без mapView:didAddAnnotationViews:метода. Я просто называю свой собственный selectAnnotation:метод, прежде чем я добавить аннотацию, с задержкой:

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

И это то , что я делаю в моем selectAnnotation:методе:

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

Проверено на два iPhone 3GS (IOS 5 и 6) и iPhone 5.

Ответил 23/10/2012 в 09:31
источник пользователем

голоса
0

У меня был подобный трудности, но на самом деле не в состоянии сделать этот метод работать вообще, не говоря уже о непоследовательно.

Вот что я нашел работу. Может быть , это будет работать для вас тоже: Как вызвать вид выноски MKAnnotationView, не затрагивая булавку?

Ответил 24/08/2009 в 03:53
источник пользователем

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