#iphone #objective-c #mkmapview
#iPhone #objective-c #mkmapview
Вопрос:
Я разрабатываю приложение для iphone, которое работает с картами. У меня много аннотаций. Мне нужны разные изображения, которые будут загружены в пузырь выноски.Это означает, что пользователь может редактировать выноску, это может быть изображение, и он также вводит текст в пузырьке выноски.Как я могу выполнить несколько действий над пузырьком выноски.
И самое важное, что эта аннотация должна отображаться на карте после нажатия кнопки сохранить. Например, у меня есть два класса (mapview и photoview), а в PhotoView у меня есть три кнопки (choosphoto, takephoto, usephoto), когда пользователь делает снимок или просматривает фотографию, и он хочет использовать эту фотографию.Когда он нажимает на кнопку usephoto, после этого аннотация должна исчезнуть.И отобразить в MapView.
Ответ №1:
Вторая половина вашего вопроса не очень понятна, но я попытаюсь ответить на первую.
Единственная реальная настройка, которую вы можете применить к виду выноски для MKAnnotation, — это установить заголовок, метки субтитров и левый / правый calloutAccessoryViews. Вы можете установить для последнего значение images или callOutAccessoryViewIndicators, или другое UIView, но оно не может быть выше 32 пикселей. Документация MKAnnontationView
Боюсь, что это действительно так. Для чего-либо более продвинутого, чем это, вам придется создать пользовательскую реализацию. Это сообщение в блоге должно быть полезным, я планирую создать что-то подобное сам.
MKPinAnnontationView можно настроить на отображение на карте, как вы описываете, поэтому, если вас устраивает изображение пина для самого вида аннотации, вы можете просто присвоить его animatesDrop
свойству значение YES, и оно будет анимировано на карте при ее добавлении.
Документация MKPinAnnontationView
РЕДАКТИРОВАТЬ: Я думаю, это то, что вы хотите;-
В вашем контроллере MapView определите свойство для хранения объекта, который вы хотите анимировать.
@interface MyMapViewController {
Photo *photoToAnimate;
}
@property (nonatomic, retain) Photo *photoToAnimate;
@end
Затем в вашем файле реализации добавьте следующее к ViewDidAppear
-(void)ViewDidAppear {
...
if (photoToAnimate) {
[mapView addAnnotation:photoToAnimate];
self.photoToAnimate = nil; // reset it for the next time
}
...
}
Затем в вашем PhotoViewController просто установите свойство при нажатии кнопки
-(void)usePhotoAction {
...
mapViewController.photoToAnimate = photo;
...
}
По крайней мере, это действительно простой хакерский способ того, что я пытался описать в комментариях. ViewDidAppear
сработает при повторном появлении MapView и соответствующим образом добавит к себе PIN-код. Если вам нужно добавить более одного вывода, используйте массив для их хранения и выполняйте итерации по массиву.
Для этого могут быть лучшие шаблоны, но, короче говоря, вашему MapView необходимо каким-то образом получить объект, который вы хотите удалить, а затем фактически ничего с ним не делать, пока не будет вызван ViewDidAppear
.
Комментарии:
1. Моя вторая половина посвящена только аннотации, но она немного сложная. Я говорю о свойстве animatesDrop для pin-кода, я хочу, чтобы оно выпадало после нажатия кнопки, которая находится на странице настроек, а не там, где карта. Когда пользователь переходит на страницу настроек, если он хочет удалить pin-код, нажмите на ту кнопку, которая в настройках не отображается. После нажатия на кнопку, когда он зашел на страницу карты, он нашел PIN-код текущего местоположения пользователя.
2. Верно, если я вас правильно понимаю, пользователь не может видеть «страницу настроек» одновременно с картой? Итак, после нажатия кнопки на странице настроек, когда пользователь возвращается к карте, pin-код должен анимироваться, вставляясь на место?
3. Да, вы правы. На странице настроек есть одна кнопка сброса, когда пользователь нажимает на эту кнопку, только после этого прикрепляет ее к текущему местоположению.
4. Хорошо, тогда вам может потребоваться передать аннотацию в MapView и попросить этот дескриптор добавить ее на карту, когда она снова станет видимой. Как только вы вызовете
[mapView addAnnotation:annotation]
, он выполнит удаление, так что это может происходить, пока MapView все еще не отображается на экране.5. Я объяснил, что я имел в виду. Хороший ли это способ сделать это, я не знаю (вероятно, нет). Это не очень чисто или надежно на будущее, но если требование простое, должно сработать.