触摸视图时的“奇怪”行为

时间:2016-07-08 17:59:34

标签: ios

我正在玩观点。我的申请很简单:

  1. 我有一个自定义视图控制器及其关联视图,称之为mainView。我的自定义视图控制器会覆盖touchesBegan方法。我的touchesBegan方法为触摸的视图添加边框,并从先前触摸的视图中删除边框(如果有)。因此,我可以直观地看出最后一次触摸的视图。

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    print("There are \(touches.count) touch(es)")
    if let selectedView = self.selectedView {
        selectedView.borderWidth = 0
    }
    self.selectedView = touches.first?.view
    if let selectedView = self.selectedView {
        selectedView.borderColor = UIColor.blackColor()
        selectedView.borderWidth = 2
    }
    

    }

  2. 在主视图中我添加了一个子视图,称之为subView。

  3. 对于subView,我添加了2个子视图,称之为subSubView1和subSubView2。
  4. enter image description here

    当我触摸视图时,他们的边界会像我期望的那样出现和消失。但是,如果我重新定位subSubView1(或subSubView2)使其部分位于subView内部并且部分位于subView之外,则行为将变为“奇数”。如果我触摸subSubView1与subView重叠的部分,则subSubView1接收边框。如果我触摸与mainView重叠的subSubView1部分,那么接收边框的是mainView。请有人帮我理解这种行为吗?

    Xcode 7.3,使用iPhone 6模拟器进行调试。

1 个答案:

答案 0 :(得分:0)

如果视图位于其父级之外,则该视图不可选。我会假设触摸事件从底部冒出来(mainView)。然后它转到mainView的孩子们。如果触摸不在该孩子中则停止。因此,不在其父级中的子视图部分将不会接收不在其父级中的触摸事件。

有关详细信息,请参阅this question

如果链接位于登录墙后面,则复制文本。

  

问:我的视图在屏幕上正确显示,但未收到任何触摸事件。那是为什么?

     

答:此问题的最常见原因是因为您的视图位于其父视图的边界之外。当您的应用程序收到触摸事件时,将启动命中测试过程以确定应该接收事件的视图。该过程从视图层次结构的根开始,通常是应用程序的窗口,并按前后顺序搜索子视图,直到找到触摸下的最前面的视图。该视图成为命中测试视图并接收触摸事件。此过程中涉及的每个视图首先测试事件位置是否在其范围内。只有在测试成功后,视图才会将事件传递给子视图以进行进一步的命中测试。因此,如果您的视图处于触摸状态但位于其父视图边界之外,则父视图将无法测试事件位置,也不会将触摸事件传递给您的视图。