【问题标题】:UIViewContorller's touch event is still received even a view has added即使添加了视图,仍然会收到 UIViewContorller 的触摸事件
【发布时间】:2019-08-08 14:02:03
【问题描述】:

有一个简单的UIViewController,有两个按钮,每次按下一个按钮,viewcontorller 的视图就会添加一个全屏视图,因为它的大小与viewcontroller 相同。

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

但是如果我按下button0,然后快速按下button1,视图就会添加到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()
    }

输出:

button0Pressed button1Pressed

那么,在按下button0 后如何防止viewcontrollers 快速触摸事件?

【问题讨论】:

  • 你的问题是什么?
  • 可以尝试添加view.MultipleTouchEnable = false
  • @pooja 不行,不是pressing the two buttons together而是pressing two buttons between very short inverval
  • 你可以使用按钮或手势识别器,但不能同时使用吗?

标签: ios swift cocoa-touch uikit uicontrolevents


【解决方案1】:

您可以尝试将两个按钮(button0 和 button1)都设置为 IBOutlet 并分配 touchUpInside 事件来触发 button0Press/button1Press 函数。然后您可能会enable button1 after x seconds(在我的示例中为 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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多