TouchesBegan 总是返回错误的 UIView

Posted

技术标签:

【中文标题】TouchesBegan 总是返回错误的 UIView【英文标题】:TouchesBegan always returns wrong UIView 【发布时间】:2018-11-14 10:26:53 【问题描述】:

我想检测我何时触摸其他地方而不是特定的UIView。我正在使用touchesBegan,但是,它总是打印“触摸在外面”(见下面的代码)。我错过了什么?

我从这个post得到了帮助。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 
    if let touch = touches.first 
        let hitView = self.view.hitTest(touch.location(in: self.view), with: event)
        if hitView === checkBackContainer 
            print("touch is inside")
         else 
            print("touch is outside")
        
    
    super.touchesBegan(touches, with: event)

ViewDidLoad函数中添加的锚

private lazy var checkBackContainer = ImageUploadContainerView()

override func viewDidLoad()
self.view.addSubview(checkBackContainer)
checkBackContainer.anchorCenterXToSuperview()
checkBackContainer.topAnchor.constraint(equalTo: checkFrontContainer.bottomAnchor, constant: 20).isActive = true
checkBackContainer.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 25).isActive = true
checkBackContainer.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -25).isActive = true
checkBackContainer.heightAnchor.constraint(equalTo: checkBackContainer.widthAnchor, multiplier: 0.42).isActive = true
checkBackContainer.layer.applySketchShadow(color: UIColor.white, alpha: 1.0, x: 0, y: 0.33, blur: 1, spread: 0, cornerRadius: 6)

let backTap = UITapGestureRecognizer(target: self, action: #selector(self.backContainerTapped(_:)))
checkBackContainer.addGestureRecognizer(backTap) 

编辑: ContainerView 是一个自定义的UIView,其中包含一些UIStackViews、UIlabels 和UIImageViews。我发现这是因为自定义UIView,当我用常规UIView 更改它时。它正在工作。

【问题讨论】:

尝试在 viewDidLayoutSubviews 中添加锚点...看看是否有所作为。但我怀疑 checkBackContainer.anchorCenterXToSuperview() 无论如何都是罪魁祸首。也尝试将 checkBackContainer 放在前面。 我也尝试用 CGRect 给出位置。当我这样做时,只需一点点的 UIView 就会检测到里面。 您获得的事件是否属于容器视图的子控件? 【参考方案1】:

尝试将 UIGestureRecognizer 添加到您希望在触摸时检测到的视图中:

let tap = UITapGestureRecognizer(target: self, action: #selector(didTap(sender:)))
view1.addGestureRecognizer(tap)
view2.addGestureRecognizer(tap)

@objc func didTap(sender: UITapGestureRecognizer) 
//Perform whatever you want in here

或者,您可以遍历父视图的所有子视图并排除您想要排除的任何视图,如下所示:

for view in self.view.subviews 
   if view != viewYouWantToExclude 
      view.addGestureRecognizer(tap)
   

【讨论】:

我的问题是我想检测视图之外的触摸。使用您的代码,我只能检测到不在它之外的视图。 确切地说,如果您将手势识别器添加到除了要排除的视图之外的所有视图,这就是您将获得的功能。这可以说不是最好的方法,但它肯定会奏效。

以上是关于TouchesBegan 总是返回错误的 UIView的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

返回 Mono 和 Flux 错误总是返回 500

为啥 InstanceID 总是返回一个令牌,尽管有错误的 senderId?

节点猫鼬总是在 findOne 上返回错误

PDO 准备和执行查询总是返回错误