MKAnnotationView - блокировка пользовательского представления аннотаций для закрепления обновлений местоположения

Обновление №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];
    }
}

person djibouti33    schedule 17.06.2011    source источник
comment
@JARinteractive - я думаю, что вы постоянный эксперт, поскольку вы написали сообщение в блоге, за которым я следую. Есть ли у вас какие-либо идеи?   -  person djibouti33    schedule 18.06.2011
comment
В проекте, на который вы ссылаетесь, не хватает пары PNG, map_marker и map_marker @ 2x. Можете ли вы включить и заменить застежку-молнию? Кроме того, присвоение имени вашему методу setAnnotation ... заставило меня почувствовать себя лучше в отношении именования моего метода, когда я расстраиваюсь.   -  person RyanR    schedule 26.06.2011
comment
Ха! Думаю, я забыл его почистить. Да, определенно то, что я придерживаюсь соглашения об именах после пяти дней выдергивания волос. Я просто добавил .png и перезагрузил. Взгляните, и спасибо, что посмотрели на это!   -  person djibouti33    schedule 26.06.2011
comment
Ссылка на пример кода у меня не работает. Есть какие-нибудь зеркала?   -  person CHiRo79    schedule 09.11.2011
comment
Просматривая ваш код, я думаю, что проблема может быть в том, как вы работаете с местоположением. Выполнение кода вначале дает одно и то же место 19 раз, после чего никогда больше. Почему бы вам не использовать CoreLocation вместо NSNotificationCenter?   -  person CHiRo79    schedule 10.11.2011


Ответы (2)


настраиваемая выноска

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

https://github.com/jacobjennings/JJMapCallout

person Jacob Jennings    schedule 09.09.2011
comment
Спасибо, Джейкоб, ваш код - это первый пример настраиваемой выноски, загруженной из .xib. Отличный ответ. - person Jano; 19.09.2011
comment
Ого, удаление мегаполиса затронуло меня лично. Я почищу и выложу на github или что-нибудь сегодня вечером. - person Jacob Jennings; 24.01.2012
comment
сэр, я добавляю некоторые детали для булавки, нажмите, как добавить - person Gami Nilesh; 18.12.2014
comment
Я не могу реализовать этот код в своем проекте, может ли кто-нибудь мне помочь - person amit gupta; 23.03.2015

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

person RyanR    schedule 26.06.2011
comment
Определенно один из способов сделать это. Я думаю, что причина, по которой @JARinteractive выполняет все в drawRect: вместо простого создания изображения, заключается в том, что стрелка, указывающая на вывод, должна быть динамической. Если булавка находится в левой части экрана, стрелка аннотации выноски будет нарисована там. То же самое, если аннотация булавки находится в правой части экрана. Кроме того, одна вещь, которая хороша в стандартной выноске, заключается в том, что она анимируется с помощью булавки от одной точки к другой. Если вы сделаете это по-своему, мне придется очистить изображение перед перемещением, а затем заставить его снова появиться после. - person djibouti33; 26.06.2011
comment
Я думаю, что используя базовый MKAnnotationView с изображением, фреймворк нарисует стрелку выноски. - person RyanR; 26.06.2011