ios - 即使添加了 View ,UIViewContorller 的触摸事件仍然会收到

标签 ios swift cocoa-touch uikit uicontrolevents

有一个简单的UIViewController,有两个按钮,每次按下按钮时,全屏 View 都会添加到viewcontorller的 View 中,作为其大小与 View Controller 相同。

我们知道,如果一个 View 与其父 View 重叠,则父 View 无法响应任何事件。

但是,如果我按下 button0,然后非常快地按下 button1, View 就会添加到 viewcontorller 和第二个按钮的触摸事件中也被诱发。

这是我的代码:

@IBAction func button0Pressed(_ sender: Any) {
        print(#function)
        let view0 = UIView(frame: view.bounds)
        view0.backgroundColor = UIColor.gray
        let tap0 = UITapGestureRecognizer(target: self, action: #selector(tap0(_:)))
        view0.addGestureRecognizer(tap0)
        view.addSubview(view0)
    }

    @objc func tap0(_ gestureRecognizer: UITapGestureRecognizer) {
        print(#function)
        let view = gestureRecognizer.view
        view?.removeFromSuperview()
    }

    @IBAction func button1Pressed(_ sender: Any) {
        print(#function)
        let view1 = UIView(frame: view.bounds)
        view1.backgroundColor = UIColor.lightGray
        let tap1 = UITapGestureRecognizer(target: self, action: #selector(tap1(_:)))
        view1.addGestureRecognizer(tap1)
        view.addSubview(view1)
    }


    @objc func tap1(_ gestureRecognizer: UITapGestureRecognizer) {
        print(#function)
        let view = gestureRecognizer.view
        view?.removeFromSuperview()
    }

输出:

button0按下 按钮1按下

那么,如何防止按下 button0viewcontroller 的快速触摸事件?

最佳答案

您可以尝试将两个按钮(button0和button1)作为IBOutlet并分配touchUpInside事件来触发button0Press/button1Press函数。然后,您可能会启用button1在x秒(在我的示例中为1秒)按下button0。反之亦然。

@IBOutlet weak var button0: UIButton!
@IBOutlet weak var button1: UIButton!


override func viewDidLoad() {
    super.viewDidLoad()
    button0.addTarget(self, action: #selector(button0Pressed), for: .touchUpInside)
    button1.addTarget(self, action: #selector(button1Pressed), for: .touchUpInside)
}

@objc func button0Pressed() {
    print(#function)
    let view0 = UIView(frame: view.bounds)
    view0.backgroundColor = UIColor.gray
    let tap0 = UITapGestureRecognizer(target: self, action: #selector(tap0(_:)))
    view0.addGestureRecognizer(tap0)
    view.addSubview(view0)

    // Enable button1 after 1 second
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
        self.button1.isEnabled = true
    }
}

@objc func button1Pressed() {
    print(#function)
    let view1 = UIView(frame: view.bounds)
    view1.backgroundColor = UIColor.lightGray
    let tap1 = UITapGestureRecognizer(target: self, action: #selector(tap1(_:)))
    view1.addGestureRecognizer(tap1)
    view.addSubview(view1)

    // Enable button0 after 1 second
    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(1000)) {
        self.button0.isEnabled = true
    }
}

关于ios - 即使添加了 View ,UIViewContorller 的触摸事件仍然会收到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55217356/

相关文章:

ios - UIScreen 是否有屏幕打开通知?

objective-c - 登录 View Controller 最佳实践

ios - Realm 多对一关系示例

swift - 如何从 Swift 中的索引开始将内存复制到 UnsafeMutableRawPointer?

swift - 检查泛型类型是否属于类内的特定类型

objective-c - 模态视图 Controller 是替代 iPad 上整个界面的首选方式吗?

ios - Swift 中的 Int 与 Integer

ios - 有没有办法记录应用程序输出的所有声音?

ios - UIImageView 动画在 UICollectionViewCell 中不能正常工作

ios - 如何为我的应用程序创建一个像这样的 "About"页面?如何在 UIView 下拥有 UITableView(分组)?