UIButton игнорирует касание, если вы касаетесь его там, где нет изображения альфа. Могу ли я изменить его, чтобы реагировать на все его границы?
Как я могу заставить UIButton реагировать на прозрачные области изображения PNG?
Ответ 1
UIButton игнорирует касание, если вы касаетесь его там, где нет изображения альфа. Могу ли я изменить его, чтобы реагировать на все его границы?
Один простой способ, который, как я думаю, все еще работает, - установить цвет фона на то, что только в основном прозрачно. Альфа, которая очень маленькая, но еще более 0,1, должна выглядеть прозрачной, но все же реагировать на прикосновения.
В противном случае, да, вы можете переопределить -hitTest:withEvent:
так, чтобы он возвращал YES, даже если затронутая область прозрачна.
Ответ 2
Я действительно делаю это все время, когда я помещаю изображение с прозрачным фоном в UIImageView
, а затем помещаю UIButton
с его backgroundColor
, установленным в [UIColor clearColor]
поверх изображения. Таким образом, особенно с небольшими изображениями, я могу сделать кнопку "невидимая" более крупной и легкой для пользователя.
Ответ 3
Просто следуя предложению Калеба переопределить hitTest и черпая вдохновение у Сороуса Ханлоу, это заставляет любой подкласс UIButton реагировать на любое касание, которое происходит в кадре:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
guard
isUserInteractionEnabled,
!isHidden,
alpha >= 0.01,
self.point(inside: point, with: event)
else {return nil}
for subview in subviews.reversed() {
let convertedPoint = subview.convert(point, from: self)
if let candidate = subview.hitTest(convertedPoint, with: event) {
return candidate
}
}
return self
}
Ответ 4
У меня есть расширение UIView
, которое поможет. Просто пусть ваша кнопка вызывает этот метод.
extension UIView {
public func makeBackgroundAlpha002() {
backgroundColor = UIColor(white: 0, alpha: 0.02)
}
}
Почему альфа 0,02? Если вы прочитаете документацию Apple, они объяснят магию во время тестирования на удар.
Этот метод игнорирует скрытые объекты просмотра, которые отключили взаимодействие с пользователем или имеют уровень альфа менее 0,01.