Пользовательский MKAnnotationView - Как захватить прикосновения и НЕ отклонить выноску? - PullRequest
3 голосов
/ 25 июля 2011

У меня есть собственный подкласс MKAnnotationView.Он показывает вид именно так, как я хочу.В этом представлении у меня есть кнопка.Я хочу захватить события на кнопке, чтобы выполнить действие.Это работает просто отлично.

Однако я НЕ хочу, чтобы выноска была отклонена или исчезла.По сути, прикосновение к кнопке в выноске приведет к воспроизведению звука, но я хочу оставить аннотацию вверх, чтобы пользователь мог нажать «Стоп», если он этого хочет, без необходимости снова касаться булавки карты, чтобы вернуть аннотацию обратно.В другом случае я хочу, чтобы касание кнопки анимировало больше деталей в выноске, поэтому я определенно не хочу отклонять выноску в этой точке.

Как я могу предотвратить исчезновение выноски, когда пользователь выбираетвыноска или кнопка внутри выноски?

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Возможно, это не лучшее решение, но оно определенно работает. Прежде всего, я попробовал несколько вещей, таких как наблюдение за контекстом и тому подобное, но я никогда не терпел крах, и это казалось громоздким. Итак, вот что я сделал:

Сначала я указал, что является контролирующим фактором для сохранения возможности просмотра предупреждений. В моем случае я создал пользовательский вид аннотации, и всякий раз, когда пользователь нажимает кнопку в этом пользовательском представлении, я хочу, чтобы он оставался видимым и, возможно, даже менял содержимое. Итак, я установил делегата в этом пользовательском представлении, чтобы моя карта могла знать, когда что-то меняется. В моем контроллере представления карты я ловлю это сообщение и устанавливаю переменную члена класса в значение true, чтобы показать, что я хочу, чтобы представление аннотации оставалось.

ПРИМЕЧАНИЕ. Это произойдет до того, как появятся сообщения выбора.

Теперь в моем методе didDeselectAnnotation я проверяю логическое значение. Если я хочу, чтобы он оставался видимым, я выбираю НЕ удалять свою аннотацию, я сбрасываю логическое значение, и я повторно выбираю аннотацию вручную, устанавливая анимацию на НЕТ. Это позволяет представлению аннотации «оставаться» видимым - возможно, читом, но пользователь не может видеть разницу. Всякий раз, когда это логическое значение говорит, что отмена выбора в порядке, я просто удаляю аннотацию, и все в порядке.

Итак, рабочий процесс такой:

  1. Сенсорный штифт
  2. Отображается CustomAnnotationView
  3. Пользователь нажимает кнопку в CustomAnnotationView, которая уведомляет делегата (mapView), что произошло действие
  4. Установите логическое значение класса, чтобы знать, что вы хотите оставить аннотацию около
  5. mapView затем вызывает метод didDeselectAnnotation
  6. В методе didDeselectAnnotation используйте условное решение, чтобы решить, следует ли удалять аннотацию, или сохраните ее, не удаляя аннотацию и повторно выбирая ее вручную без анимации.

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

Если вы найдете лучшее решение, пожалуйста, опубликуйте его здесь!

1 голос
/ 21 ноября 2012

Вы можете подавить закрытие выноски, используя hittest, проверьте этот следующий пост. Обнаружение нажатия на заголовок выноски

...