Полностью прозрачная UIButton с нерегулярной областью попадания

#uibutton #hittest #alpha-transparency

#uibutton #hittest #альфа-прозрачность

Вопрос:

Я знаю, как использовать фоновое изображение с альфа-каналом для создания UIButton с нерегулярной областью касания. Но с этим решением прозрачной является только область игнорирования касания; область касания состоит из непрозрачных элементов.

Я хочу, чтобы он был полностью прозрачным UIButton , с нерегулярной областью нажатия. (Это запускает анимацию за кнопкой.)

Кажется, что какое-то дополнительное UILayer тестирование с некоторым попаданием могло бы сработать, но я не совсем понимаю, как. Предложения приветствуются.

Ответ №1:

Вот мое решение. Проблема: UIImageView (назовем это базовым видом), к которому я хочу прикрепить область касания неправильной формы. Область соответствует чему-то на изображении, давайте назовем это рекой. Это может быть несвязанная область.

В Finder продублируйте изображение view и сделайте все пиксели, не относящиеся к реке, прозрачными, используя ваше любимое графическое приложение. Назовем это изображением маски.

При нажатии на базовый вид проверьте, является ли соответствующий пиксель в изображении маски прозрачным. (Решение оставлено читателю; примеров предостаточно.)

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

Обратите внимание, что если базовый вид изменяется или перемещается (как это происходит в моем приложении, с помощью анимации его ограничений), то вам также нужно «переместить» изображение маски или каким-либо другим способом управлять переводом координат между видом и маской. Самый простой способ сделать это — сделать изображение маски скрытым подвидом базового вида, при этом его левый, верхний, ведущий и конечный привязки должны быть равны привязкам базового вида. Затем они перемещаются вместе, и согласованный перевод между ними является идентификатором.

Я поместил все это в подкласс UIImageView , чтобы он управлял своей собственной маской и вызывал делегат, если задействована «река» (или что-то еще).