clipsToBounds是如何工作的?

129
我想知道如何使用UIViewclipsToBounds属性。

官方文档中说:

 

clipsToBounds 属性

    

一个布尔值,用于确定子视图是否限制在视图的边界内。

    

讨论
  将此值设置为YES会导致子视图被剪裁到接收器的边界内。如果设置为NO,则超出接收者可见边界的子视图将不会被剪切。默认值为NO

但我不清楚这到底意味着什么。我应该如何使用clipsToBounds?将此属性设置为YESNO有什么后果?
2个回答

338
如果我的父视图是一个边长为10个单位的框,而我的子视图宽度为20个单位,并且clipsToBounds设置为YES,那么我只会看到适合父视图边界内的子视图部分。否则,如果clipsToBounds设置为NO,我将看到整个子视图,甚至是超出父视图范围之外的部分(假设我们仍在屏幕上)。
作为视觉示例,请考虑在故事板上设置以下视图:
这是一个白色UIView,左上角有一个标签,标签上有一个简单的“1”或“2”,以便我可以将其称为view1view2。此外,黑色视图与白色视图尺寸相同,但其原点位于白色视图中心。
在视图控制器的viewDidLoad方法中,我们有以下代码:

Objective-C:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}

Swift:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}

当我们运行代码并在模拟器或设备上查看时,我们得到以下结果:

enter image description here

尽管这些视图被设置为完全相同(除了clipsToBounds),它们看起来不同。这就是clipsToBounds的作用。将其设置为YES将提供顶部结果,而将其设置为NO将提供底部结果。

如果我们调试视图层次结构,我们可以更清楚地看到黑色框实际上都扩展到白色视图的边界之外,但只有视图2在应用程序实际运行时显示这一点:

enter image description here


4
回答很棒!做得好。但我有一个问题。如果‘clipsToBounds’属性等于‘true’,为什么UITextView的阴影不可见?如果它是‘false’,就可以正常工作。 - Mannopson
2
注意:需要更改 clipsToBounds 的是父视图。因此,如果 viewB 是 viewA 的子视图,则需要将 clipsToBounds 设置为 true 的是 viewA。 - Ian Kohlert
在哪个视图框架中显示从原始视图中显示的视图,触摸手势是否有效,因为我已经检查过了,它没有起作用。 - Pravin Tate

17
如果苹果公司要重新命名此属性,我会将其命名为:clipSubviewsToBounds
为什么呢?
我们的代码中出现了一个 bug。其中父视图的高度被设置为 0,我们希望看不到其任何元素/子视图。然而,父视图的子视图仍在显示。
这是因为没有将clipToBounds设置为true。一旦设置为true,子视图的高度就不能超过其父视图的高度,否则它们会被剪裁,只显示到其父视图的高度。在这种情况下,它们会在0处被剪裁即完全隐藏。
在使用 Xcode 的“调试视图层次结构”调试您的视图时,具有这种洞察力很有帮助,因为您可以选择显示剪切内容并查看子视图是否被剪切到其父视图的边界。例如,如果您的子视图的宽度为250,而其父视图仅有200,则一旦切换,您将看到额外的50个点被剪切/隐藏。
图片描述:enter image description here

1
这个答案被低估了。 - saurabh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接