【问题标题】:Passing tap action from one view to another将点击动作从一个视图传递到另一个视图
【发布时间】:2019-05-22 14:27:20
【问题描述】:

我有两个 UIView A 和 B。这两个视图都放在另一个上。假设视图 A 位于 B 上方。因此,当我点击视图 A 时,它会消耗所有点击动作。但我不希望仅在视图 A 之前使用该操作。我想在被点击的视图 B 上执行操作。

我所有的观点都有userInteractionEnabled = true

class PassthroughView : UIView {
  override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? 
  {
    let view = super.hitTest(point, with: event)
    return view == self ? nil : view
  }

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        print("Tap Called")
        return false
    }
}

我在看到一些解决方案后尝试了这些代码,但似乎没有工作。

View A 也有滑动手势可以工作。

 _V_i_e_w_B___
|   ____
|  |View A
|  |
|  |
|  |
|  |
|__|__
   |_____

【问题讨论】:

  • 如果您在视图 A 中有滑动手势,它将不起作用

标签: ios swift uiview uitapgesturerecognizer


【解决方案1】:

仅在 UIView 子类中覆盖 hitTest 方法

class PassthroughView : UIView {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
    {
        let view = super.hitTest(point, with: event)
        return view == self ? nil : view
    }
}

并使用子类创建视图 A,使用 UIView 类创建另一个视图 B。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let b = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
        b.backgroundColor = .gray
        b.center = view.center
        view.addSubview(b)

        let a = PassthroughView(frame: CGRect(x: 0, y: 0, width: 275, height: 275))
        a.backgroundColor = .lightGray
        a.center = view.center
        view.addSubview(a)       
    }
}

【讨论】:

  • 但是我可以在PassthroughView上使用滑动手势吗?
【解决方案2】:

每当视图 A 放置在视图 B 上方时,将视图 A 的 userInteractionEnabled 更改为 false,您的点击将传递给视图 B。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多