Как я могу переслать касания в UIButton из другого UIView? - PullRequest
4 голосов
/ 19 августа 2010

У меня есть UIButton и UIView.Вид расположен над кнопкой и больше размера кнопки.Сам вид - это то, что я хочу, чтобы принимать сенсорные события, и я бы хотел перенаправить их на кнопку, чтобы все обычные визуальные изменения кнопки при касании происходили.

Я не могу заставить эту работу работать - мой UIView реализует touchesBegan / Moved / Ended / Cancelled, поворачивается и вызывает те же методы для кнопки с теми же аргументами.Но кнопка не отвечает.

Я гарантировал, что сенсорные методы на самом деле вызываются в UIView.

Есть ли что-то очевидное, что я здесь упускаю, или лучший способ донести контрольные сообщения?Или есть веская причина, почему это не должно работать?

Спасибо!

[Примечание: я не ищу обходных путей для дизайна вида + кнопки.Давайте предположим, что это требование.Меня интересует понятие элементов управления, которые являются сенсорными прокси для других элементов управления.Спасибо.]

Ответы [ 3 ]

9 голосов
/ 20 августа 2010

Создайте ContainerView, который содержит кнопку и переопределите hitTest:withEvent:, чтобы он возвращал экземпляр UIButton.

0 голосов
/ 29 мая 2019

Я использую небольшой класс ниже, когда мне нужно больше сенсорной цели, чем визуальный размер кнопки.

Использование:

let button = UIButton(...) // set a title, image, target/action etc on the button
let insets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
let buttonContainer = TouchForwardingButtonContainer(button: button, insets: insets) // this is what you add to your view
// a container view for a button that insets the button itself but forwards touches in the inset area to the button
// allows for a larger touch target than the visual size of the button itself
private class TouchForwardingButtonContainer: UIView {
    private let button: UIButton

    init(button: UIButton, insets: UIEdgeInsets) {
        self.button = button

        super.init(frame: .zero)

        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)
        let constraints = [
            button.topAnchor.constraint(equalTo: topAnchor, constant: insets.top),
            button.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -insets.bottom),
            button.leftAnchor.constraint(equalTo: leftAnchor, constant: insets.left),
            button.rightAnchor.constraint(equalTo: rightAnchor, constant: -insets.right)
        ]
        NSLayoutConstraint.activate(constraints)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        return button
    }
}
0 голосов
/ 19 августа 2010

Вы уверены, что ваши методы вызываются?Если вы не установили userInteractionEnabled = YES, то это не сработает.

Я уже раньше использовал такую ​​переадресацию без проблем, поэтому я не знаю, почему вы видите проблемывы видите.

...