我正在玩观点。我的申请很简单:
我有一个自定义视图控制器及其关联视图,称之为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
}
}
在主视图中我添加了一个子视图,称之为subView。
当我触摸视图时,他们的边界会像我期望的那样出现和消失。但是,如果我重新定位subSubView1(或subSubView2)使其部分位于subView内部并且部分位于subView之外,则行为将变为“奇数”。如果我触摸subSubView1与subView重叠的部分,则subSubView1接收边框。如果我触摸与mainView重叠的subSubView1部分,那么接收边框的是mainView。请有人帮我理解这种行为吗?
Xcode 7.3,使用iPhone 6模拟器进行调试。
答案 0 :(得分:0)
如果视图位于其父级之外,则该视图不可选。我会假设触摸事件从底部冒出来(mainView)。然后它转到mainView的孩子们。如果触摸不在该孩子中则停止。因此,不在其父级中的子视图部分将不会接收不在其父级中的触摸事件。
有关详细信息,请参阅this question。
如果链接位于登录墙后面,则复制文本。
问:我的视图在屏幕上正确显示,但未收到任何触摸事件。那是为什么?
答:此问题的最常见原因是因为您的视图位于其父视图的边界之外。当您的应用程序收到触摸事件时,将启动命中测试过程以确定应该接收事件的视图。该过程从视图层次结构的根开始,通常是应用程序的窗口,并按前后顺序搜索子视图,直到找到触摸下的最前面的视图。该视图成为命中测试视图并接收触摸事件。此过程中涉及的每个视图首先测试事件位置是否在其范围内。只有在测试成功后,视图才会将事件传递给子视图以进行进一步的命中测试。因此,如果您的视图处于触摸状态但位于其父视图边界之外,则父视图将无法测试事件位置,也不会将触摸事件传递给您的视图。