当在相同的 ViewController 下触摸具有相同父视图的两个视图时,iOS 无法获取新的 touchEvent

Posted

技术标签:

【中文标题】当在相同的 ViewController 下触摸具有相同父视图的两个视图时,iOS 无法获取新的 touchEvent【英文标题】:iOS Could not get new touchEvent when touch two view with same parent view under a Same ViewController 【发布时间】:2017-02-20 11:28:18 【问题描述】:

在这里我有这样的图片 A,B 是 addSubView 到 C,C 增加 SubView 到 D ViewController 的 View,我重写了 D ViewController 的 touchxx 函数(比如 touchesBegan..),首先我触摸 A 区并保持那个 touchEvent,然后在 B 区开始另一个触摸,但是奇怪的是当我触摸 B 区域(和 C 区域)时我无法获得任何新事件 我猜当ios调度touchEvents时它可能首先比较两个View的父View(这里是A,B和C)然后在这个View下新的touchEvent会被忽略吗?

所以问题是我的问题是否是错误的,或者是否有任何技巧或某种方法可以破解这个 TouchEvent 的出现?

更新:我发现我在初始实现中设置了 A & B UIImageView,所以出现了这个问题,如果 A & B 是 UIView 那么就没有这个问题...

【问题讨论】:

我没有正确回答问题 :-(。U 在“A”视图中触摸,并且没有移除您的手指在“B”视图中用另一根手指触摸,B 视图触摸事件无法识别? 【参考方案1】:

您当前所做的是捕获 D 的触摸,而不是 A。如果您不捕获 A 的触摸事件,那么它将传递到它的子视图 C,并且由于 C 不捕获触摸事件,它将传递到 D。当你触摸 B 时,没有 B 捕获触摸事件,你实际上是在再次触摸 D。

要捕捉 D 的多次触摸,您需要多点触控手势识别器或启用 D 视图的多点触控。

【讨论】:

【参考方案2】:

如果其他人遇到类似的问题,那么你可以使用一些 Control 而不是 UIView(这里是 UIImageView),然后用 UIView 替换它。如果像我一样需要 UIImageView 的背景图片,那就给 UIView 添加一个扩展

 extension UIView

    func setBackgroundImage(img: UIImage)

        UIGraphicsBeginImageContext(self.frame.size)
        img.draw(in: self.bounds)
        if let image = UIGraphicsGetImageFromCurrentImageContext() 
            UIGraphicsEndImageContext()
            self.backgroundColor = UIColor(patternImage: image)
        else 
            UIGraphicsEndImageContext()
        
    

PS:我仍然无法解释为什么 iOS 会这样做 4 me :(

【讨论】:

以上是关于当在相同的 ViewController 下触摸具有相同父视图的两个视图时,iOS 无法获取新的 touchEvent的主要内容,如果未能解决你的问题,请参考以下文章

当在 Swift Spritekit 中触摸并按住屏幕时,我将如何向上移动我的节点?

推送 ViewController 后的触摸事件问题

跨 ViewController 跟踪触摸

ViewController 不响应触摸

无需触摸即可滑动 UITableViewCell

阻止 ViewController 拦截触摸