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

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

Ответ 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.