UIView clipToBounds 没有停止子视图接收父视图之外的触摸

Posted

技术标签:

【中文标题】UIView clipToBounds 没有停止子视图接收父视图之外的触摸【英文标题】:UIView clipToBounds is not stopping a subView receiving touches outside the parent view 【发布时间】:2012-10-03 17:56:37 【问题描述】:

我有两个 UIView。我正在使用一个来包含另一个,以便我可以将一个滑入另一个。我遇到了一个问题,即使子视图被剪辑到其父视图的边界,它仍会接收触摸事件并阻止对其他底层视图的访问。

我有三个显示布局的屏幕截图。我已将父级着色为绿色,将子级着色为红色。

这个想法是用户点击“查看”并且子视图向上滑动。 subView在默认位置时,UITabBar被覆盖,无法点击。您可以在底部出现红色视图的第一张图像中看到这一点。当 subView 移到顶部时,可以单击 UITabBar,因为它现在可见。在第三张图片中,我展示了在绿色 UIView 上启用 clipToBounds 的情况。

我已经启用了 clipToBounds,所以我不明白为什么 subView 会阻塞底层的 UITabBar。我对clipToBounds的理解完全错了吗??

【问题讨论】:

危险!戴墨镜看这个问题???? 很抱歉。颜色有点有点亮???? 【参考方案1】:

使用 clipToBounds 只会影响 subView 的视觉布局,不会影响逻辑布局。这意味着虽然我的 subView 肉眼不可见,但触摸可见。

我已经通过动画子视图的大小而不是它的位置来解决这个问题。在我下面的代码中,stationProximityView 是 subView。我将其大小设置为 40 像素的动画,以使黑色标题重新出现。

[UIView beginAnimations:@"stationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectOffset(self.stationProximityView.view.frame, 0, -40);
[UIView commitAnimations];

当我不再需要它时,我会将其制作成动画。

[UIView beginAnimations:@"stationProximityBar" context:NULL];
self.stationProximityView.view.frame = CGRectMake(0 ,0, 320, 500);
[UIView commitAnimations];

如果用户点击视图按钮,则显示整个子视图:

 [UIView beginAnimations:@"stationProximityBar" context:NULL];
 self.stationProximityView.view.frame = CGRectMake(0,460,320,40);
 [UIView commitAnimations];

关闭会导致视图以与小栏相同的方式隐藏。

 [UIView beginAnimations:@"hideStationProximityBar" context:NULL];
 self.stationProximityView.view.frame = CGRectMake(0,0,320,500);
 [UIView commitAnimations];

目前,此代码仅在 iPhone 5 上进行测试,因此 500 的硬编码高度会导致以前的 iPhone 型号出现问题。

【讨论】:

以上是关于UIView clipToBounds 没有停止子视图接收父视图之外的触摸的主要内容,如果未能解决你的问题,请参考以下文章

WPFのclipToBounds与maskToBounds的区别

获取作为子视图添加的 UIView 的可见矩形

iOS UIScrollView clipToBounds = NO 未检测到子视图

停止仿射变换应用于子视图

当视图消失时,UIView动画停止,重新出现时不再恢复

UIView有圆角和投影?