代码之家  ›  专栏  ›  技术社区  ›  Ben Zotto sberry

如何从另一个UIView将触摸转发到UIButton?

  •  4
  • Ben Zotto sberry  · 技术社区  · 14 年前

    我有一个ui按钮和ui视图。视图位于按钮上方,并且在大小上大于按钮。视图本身就是我想要接受的触摸事件,我想把它们转发给按钮,这样所有正常的按钮在触摸时的视觉变化都会发生。

    我似乎无法实现这一点——我的UIView实现了touchesBeging/Moved/Ended/Cancelled,并使用相同的参数在按钮上调用相同的方法。但按钮没有反应。

    我已经确保触摸方法实际上是在UIView上被调用的。

    有没有什么明显的地方我遗漏了,或者有更好的方法让控制信息传达出去?或者有什么好的理由不应该这样做?

    2 回复  |  直到 14 年前
        1
  •  9
  •   falconcreek    14 年前

    创建 ContainerView 包含按钮和覆盖的 hitTest:withEvent: 所以它返回UIButton实例。

        2
  •  0
  •   tc.    14 年前

    我以前使用过这种触摸转发,但是没有问题,所以我不知道你为什么会看到这些问题。

        3
  •  0
  •   Ben Packard Ross Knipe    5 年前

    当我需要比按钮的视觉尺寸更大的触摸目标时,我使用下面的小类。

    用法:

    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
        }
    }