#uibutton #hittest #alpha-transparency
#uibutton #hittest #альфа-прозрачность
Вопрос:
Я знаю, как использовать фоновое изображение с альфа-каналом для создания UIButton
с нерегулярной областью касания. Но с этим решением прозрачной является только область игнорирования касания; область касания состоит из непрозрачных элементов.
Я хочу, чтобы он был полностью прозрачным UIButton
, с нерегулярной областью нажатия. (Это запускает анимацию за кнопкой.)
Кажется, что какое-то дополнительное UILayer
тестирование с некоторым попаданием могло бы сработать, но я не совсем понимаю, как. Предложения приветствуются.
Ответ №1:
Вот мое решение. Проблема: UIImageView
(назовем это базовым видом), к которому я хочу прикрепить область касания неправильной формы. Область соответствует чему-то на изображении, давайте назовем это рекой. Это может быть несвязанная область.
В Finder продублируйте изображение view и сделайте все пиксели, не относящиеся к реке, прозрачными, используя ваше любимое графическое приложение. Назовем это изображением маски.
При нажатии на базовый вид проверьте, является ли соответствующий пиксель в изображении маски прозрачным. (Решение оставлено читателю; примеров предостаточно.)
Таким образом, изображение маски фактически никогда не отображается, оно просто используется в качестве ссылки.
Обратите внимание, что если базовый вид изменяется или перемещается (как это происходит в моем приложении, с помощью анимации его ограничений), то вам также нужно «переместить» изображение маски или каким-либо другим способом управлять переводом координат между видом и маской. Самый простой способ сделать это — сделать изображение маски скрытым подвидом базового вида, при этом его левый, верхний, ведущий и конечный привязки должны быть равны привязкам базового вида. Затем они перемещаются вместе, и согласованный перевод между ними является идентификатором.
Я поместил все это в подкласс UIImageView
, чтобы он управлял своей собственной маской и вызывал делегат, если задействована «река» (или что-то еще).