clipsToBounds如何工作?

Tos*_*shi 101 frame uikit uiview bounds ios

我想知道如何使用该UIView属性clipsToBounds.

官方文档说明如下:

clipsToBounds 属性

一个布尔值,用于确定子视图是否仅限于视图的边界.

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

但我不清楚这究竟意味着什么.我该怎么用clipsToBounds?将此属性设置为YES完全有什么后果?或者NO

nhg*_*rif 264

如果我的superview是一个盒子,每侧有10个单位,而我的子视图是20个单位宽,clipsToBounds设置为YES,我只会看到子视图中符合superview范围的部分.否则,如果clipsToBounds设置为NO,我将看到整个子视图,甚至是超视图外的部分(假设我们仍然在屏幕上).

作为可视示例,请考虑在故事板上设置以下视图:

在此输入图像描述

这是一个白色的UIView左上角标签,带有简单的"1"或"2",以便我可以将它们作为view1或讨论view2.此外,黑色视图与白色视图的大小相同,但它的原点位于白色视图的中心.

在视图控制器的viewDidLoad方法中,我们有以下代码:

Objective-C的:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view1.clipsToBounds = YES;
    self.view2.clipsToBounds = NO;
}
Run Code Online (Sandbox Code Playgroud)

迅速:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view1.clipsToBounds = true
    self.view2.clipsToBounds = false
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

因此,尽管这些视图设置相同(除外clipsToBounds),但它们看起来不同.这是做什么的clipsToBounds.将其设置为YES将提供最高结果,同时将其设置为NO提供最低结果.

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

在此输入图像描述

  • 很棒的答案!做得好.但我有一个问题.如果`clipsToBounds`属性等于`true`,为什么`UITextView`阴影不可见; ?如果是'假',那就行得很好 (3认同)
  • 注意:这是您更改 ClipsToBounds 的父视图。所以如果viewB是viewA的子视图。ClipsToBounds 需要设为 true 的是 viewA。 (2认同)

Hon*_*ney 7

与公认的答案相比,这是一个简洁的快速答案

如果 Apple 要重命名此属性,我会将其命名为:clipSubviewsToBounds.

我刚刚在我们的代码中遇到了一个错误。父视图的高度设置为0. 我们希望看不到它的任何元素/子视图。然而,父视图的子视图出现了。

那是因为clipToBounds没有设置为true. 一旦设置为true,子视图的高度就不能超出0,一旦它们达到其父视图的高度,它们就会被剪裁到。在这种情况下,它们会被剪掉,0即它们根本不显示。