繁体   English   中英

通过视图层次结构传播触摸事件(UIView中的UIButton)

[英]Propagating touch event through view hierarchy (UIButton inside UIView)

可以肯定的是,这是一件容易的事,但仍然无法在Internet上找到任何类似的东西–还有一个理由认为这不是问题。 无论如何!

如何UIView放置UIButton并在视图上添加UITapGestureRecognizer ,以在此视图中调用函数,同时仍然执行按钮动作?

我有的:

  • 在按钮内部轻按仅执行按钮动作。
  • 在按钮外部轻按仅执行查看功能。

我想要的是:

  • 在按钮内部轻按可同时执行按钮操作和查看功能。
  • 在按钮外部轻按仅执行查看功能。

UPDATE(我使用的代码):

import UIKit
import AwesomeFramework

class View: UIView {

    let button = UIButton()
    let awesomeObject = AwesomeFramework.AwesomeObject()

    @objc func a(_ sender: Any) {
        // never gets called
        print("a")
    }

    init() {
        super.init(frame: .zero)

        button.translatesAutoresizingMaskIntoConstraints = false
        addSubview(button)
        NSLayoutConstraint.activate([
            button.centerXAnchor.constraint(equalTo: centerXAnchor),
            button.centerYAnchor.constraint(equalTo: centerYAnchor),
            button.widthAnchor.constraint(equalTo: widthAnchor),
            button.heightAnchor.constraint(equalTo: heightAnchor),
            ])

        button.addTarget(awesomeObject, action: #selector(awesomeAction), for: .touchUpInside) // awesomeAction prints "b"

        let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(a(_:)))
        addGestureRecognizer(gestureRecognizer)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

点击我想要的按钮:

b
a

要么

a
b

我得到:

b

更新:对示例进行了一些限制,例如:

  • 该按钮触发我无法访问的框架中的操作
  • 实际上有许多按钮和其他分接接收元件。 我不想对所有人使用a函数(同样,由于某些元素管理自己的识别器,我也不能)

在UITapGestureRecognizer的选择器内部,您可以检查触发手势的视图。 并且由于您可以访问该视图,因此可以检查发送视图的标签并确定它是否由按钮触发。

这是你怎么做的:

@objc func a(_ sender: Any) {
    if let gesture = sender as? UITapGestureRecognizer, let v = gesture.view, v.tag == self.button.tag {
        return //since it has the tag same as that you had set for button, return
    }
    // else do what you wanted to.
}

您可以将选择器链接为:

#selector(a(_:))

并定义为:

func a(_ sender: Any) { .....}

确保通过执行以下操作来标记您的按钮:

self.button.tag = 9 //(or any number you prefer)

一个按钮可以有多个目标。 告诉按钮同时触发ab

button.addTarget(self, action: #selector(a), for: .touchUpInside)
button.addTarget(self, action: #selector(b), for: .touchUpInside)

如果用户将手指放在按钮上,然后在释放之前将其拖出按钮怎么办? 如果您希望它也触发a动作,也可以这样做:

button.addTarget(self, action: #selector(a), for: .touchUpOutside)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM