MKAnnotationView - заблокировать пользовательский вид аннотации, чтобы прикреплять обновления местоположения - PullRequest
29 голосов
/ 18 июня 2011

Обновление # 5 Я думаю, что это щедрое время.Более 100 просмотров, и никто не взял удар, даже с примером кода, который я разместил.Как насчет некоторых пунктов репутации!

Обновление № 4 Это довольно сложный вопрос, поэтому я создал новый проект на основе вкладок, который просто включает части моего приложения, с которыми у меня возникают проблемыВот.Вы можете скачать его с: http://www.servinitup.net/CustomCalloutAnnotation.zip Не стесняйтесь, чтобы открыть его (необходимо добавить собственный идентификатор пакета, чтобы запустить его на своем телефоне), поиграть с ним и посмотреть, сможете ли вы получить эту проклятую аннотацию выноски длядвигайтесь с помощью булавки!

Обновление # 3 Попытка сделать setAnnotation открытым методом CalloutMapAnnotationView учебника и вызвать его напрямую.Не повезло.Несмотря на возникшие небольшие странности, единственное, что сдвинулось с места, - это маленькая треугольная часть выноски.Мне не удалось заставить весь выноски перемещаться.

Обновление # 2 Все еще не очень удача, но теперь я искал способы программно создать «щепотку для увеличения» и затем отменить еенемедленно, поэтому пользователь никогда не увидит изменения.Надеясь, что выполнение этого программно будет иметь тот же эффект, что и ручное, и аннотация выноски вернется к своему родителю.Любые идеи?

Обновление # 1 После игры вот где я получил: - заменил self.calloutAnnotation.coordinate = coords; на self.calloutAnnotation.latitude = coords.latitude;self.calloutAnnotation.longitude = coords.longitude; - С этим изменилось, если я слегка ущипнул карту, чтобы увеличитьпосле или после обновления контакта, аннотация выноски анимируется в правильное положение, прямо над контактом.

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

Исходное сообщение

Я, как и другие пользователи SO, использую это удивительное решение для создания пользовательской аннотации выноски: http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/

Когда вы используете стандартную выноску (annotationview.canShowCallout = true) и пин-код перемещается по экрану при обновлении местоположения, стандартный выноски отслеживаются прямо вместе с пин-кодом, как если бы они были заблокированы вместе.

При использовании описанного выше пользовательского решения для выноски, когда моя булавка перемещается после обновления местоположения, аннотация выноски остается в своем первоначальном местоположении.Конечно, я хотел бы имитировать стандарт iOS и иметь собственную дорожку аннотации выноски вместе с булавкой.

Вот код, который у меня есть, он успешно перемещает представление аннотации, но не настраиваемую выноскувид аннотации:

/* core location broadcasts a notification, and my view controller listens to that notification and calls locationManagerDidFindLocation */
- (void)locationManagerDidFindLocation:(NSNotification *)notif {
    CLLocation *location = [notif.userInfo objectForKey:@"location"];
    CLLocationCoordinate2D coords = [location coordinate];
    MKCoordinateSpan span = MKCoordinateSpanMake((5/69), (5/69));
    MKCoordinateRegion region = {coords, span};

    // if we don't have a current location yet, create one, place it on the map, and adjust the map's region
    // otherwise, update the annotation placement and map position in a smooth animation
    if (self.currentLocationAnnotation == nil) {
        self.currentLocationAnnotation = [[CurrentLocationAnnotation alloc] initWithCoordinate:coords andTitle:@"My Title" andSubtitle:@"My subtitle"];

        [self.mapView addAnnotation:self.currentLocationAnnotation];
        [self.mapView setRegion:region animated:true];
        [self.mapView regionThatFits:region];
    } else {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.45];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

            // this moves my annotation view perfectly
            self.currentLocationAnnotation.coordinate = coords;

            // ******* this is where my problem is
            // ******* this custom callout annotation view stays
            // ******* in it's original place, even though it's
            // ******* parent annotation view is moving around the screen
            self.calloutAnnotation.coordinate = coords;

            [self.mapView setRegion:region animated:true];
            [self.mapView regionThatFits:region];
        [UIView commitAnimations];
    }
}

Ответы [ 3 ]

32 голосов
/ 09 сентября 2011

custom callout

Я создал проект на основе вашего CalloutMapAnnotationView, демонстрирующий решение на основе IB. Клавиши со стрелками анимируют движение аннотации местоположения и аннотации выноски. Выноска теперь также автоматически изменяет размеры на основе предоставленного contentView, и представление загружается из отдельного кончика. Удачи!

https://github.com/jacobjennings/JJMapCallout

1 голос
/ 14 ноября 2011

Я проверяю ваш код и рекомендую создать новый пользовательский MKAnnotationView и инкапсулировать в него оба представления (пин-код и выноску).

Но для вашего текущего кода прочитайте одобренный ответ на этот вопрос: MKMapView Перемещение Аннотации автоматически - анимируйте их?

Приветствия.

1 голос
/ 26 июня 2011

Я знаю, что вам не понравится этот ответ, , но он работает . Образец, к которому вы привязали, просто рисует собственное изображение в наложении самым сложным способом (drawRect :). Рассматривали ли вы один раз рендеринг наложения в UIImage и просто установили свойство image в очень простом MKAnnotationView? Даже если вам необходимо периодически изменять содержимое, например, обновлять количество друзей на панели, вы можете перерисовать изображение, когда произойдет изменение, и обновить соответствующий MKAnnotationView.

...