Пользовательский MKAnnotationView - Как захватить прикосновения и НЕ отклонить выноску?
У меня есть собственный подкласс MKAnnotationView. Он показывает вид именно так, как я хочу. В этом представлении у меня есть кнопка. Я хочу захватить события на кнопке, чтобы выполнить действие. Это работает просто отлично.
Однако я не хочу, чтобы выноска была отклонена или исчезла. По сути, прикосновение к кнопке в выноске приведет к воспроизведению звука, но я хочу оставить аннотацию вверх, чтобы пользователь мог нажать "Стоп", если он этого хочет, без необходимости снова касаться булавки карты, чтобы вернуть аннотацию обратно. В другом случае я хочу, чтобы касание кнопки анимировало больше деталей в выноске, поэтому я определенно не хочу отклонять выноску в этой точке.
Как я могу предотвратить исчезновение выноски, когда пользователь выбирает выноску или кнопку внутри выноски?
2 ответа
Это может быть не лучшим решением, но оно определенно работает. Прежде всего, я попробовал несколько вещей, таких как наблюдение за контекстом и тому подобное, но я никогда не терпел крах, и это казалось громоздким. Итак, вот что я сделал:
Сначала я указал, что является контролирующим фактором для сохранения возможности просмотра предупреждений. В моем случае я создал пользовательский вид аннотации, и всякий раз, когда пользователь нажимает кнопку в этом пользовательском виде, я хочу, чтобы он оставался видимым и, возможно, даже менял содержимое. Итак, я установил делегата в этом пользовательском представлении, чтобы моя карта могла знать, когда что-то меняется. В моем контроллере представления карты я ловлю это сообщение и устанавливаю переменную члена класса в true, чтобы указать, что я хочу, чтобы представление аннотации оставалось.
ПРИМЕЧАНИЕ. Это произойдет до появления сообщений выбора.
Теперь в моем методе didDeselectAnnotation я проверяю логическое значение. Если я хочу, чтобы он оставался видимым, я предпочитаю НЕ удалять свою аннотацию, я сбрасываю логическое значение и повторно выбираю аннотацию вручную, устанавливая анимацию на НЕТ. Это позволяет аннотации "оставаться" видимой - возможно, чит, но пользователь не видит разницы. Всякий раз, когда это логическое значение говорит, что отмена выбора в порядке, я просто удаляю аннотацию, и все хорошо.
Итак, рабочий процесс таков:
- Сенсорный штифт
- CustomAnnotationView отображается
- Пользователь нажимает кнопку в CustomAnnotationView, которая уведомляет делегата (mapView) о том, что действие произошло
- Установите логическое значение класса, чтобы знать, что вы хотите сохранить аннотацию вокруг
- Затем mapView вызывает метод didDeselectAnnotation
- В методе didDeselectAnnotation используйте условное решение, чтобы решить, следует ли удалять аннотацию, или оставьте ее, не удаляя аннотацию и повторно выбирая ее вручную без анимации.
Я надеюсь, что это помогает другим. Мне понадобилось время, чтобы понять это, поэтому я надеюсь, что это сэкономит вам время.
Если вы найдете лучшее решение, пожалуйста, опубликуйте его здесь!
Вы можете подавить закрытие выноски с помощью hittest, проверьте этот следующий пост. Обнаружить нажатие на заголовок выноски