Как расширить область нажатия (hit area) у UIButton в UIKit?

«Как расширить область нажатия (hit area) у UIButton в UIKit?» — вопрос из категории UIKit, который задают на 23% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стандартная UIButton реагирует на касания только в пределах своих видимых границ (bounds). Для расширения этой области есть два основных подхода.

1. Предпочтительный способ: создание подкласса UIButton Переопределите метод point(inside:with:), чтобы учитывать дополнительные отступы.

class ExtendedHitAreaButton: UIButton {
    var hitAreaPadding = UIEdgeInsets.zero

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        // Расширяем рамку для проверки касания, используя отрицательные инсеты
        let extendedRect = bounds.inset(by: UIEdgeInsets(
            top: -hitAreaPadding.top,
            left: -hitAreaPadding.left,
            bottom: -hitAreaPadding.bottom,
            right: -hitAreaPadding.right
        ))
        return extendedRect.contains(point)
    }
}

// Использование
let button = ExtendedHitAreaButton()
button.hitAreaPadding = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10) // Увеличиваем область на 10pt с каждой стороны

Почему это лучше: Не требует добавления лишних UIView в иерархию, что эффективнее для производительности.

2. Альтернативный способ: использование Gesture Recognizer Можно добавить UITapGestureRecognizer к родительскому view, но это менее изящно и может конфликтовать с другими жестами. Первый метод является стандартным и рекомендуемым решением.