clipsToBounds如何工作?


110

我想知道如何使用该UIView物业clipsToBounds

官方文档说:

clipsToBounds 属性

一个布尔值,该值确定子视图是否限于视图的边界。

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

但是我不清楚这到底意味着什么。我应该如何使用clipsToBounds?将此属性设置为YES完全会带来什么后果?还是要NO

Answers:


283

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

作为视觉示例,请考虑在情节提要板上设置的以下视图:

在此处输入图片说明

这是白色UIView的标签,在左上角带有一个简单的“ 1”或“ 2”,因此我可以将其讨论为view1view2。此外,黑视图的大小与白视图的大小相同,但其原点位于白视图的中心。

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

目标C:

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

迅速:

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

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

在此处输入图片说明

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

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

在此处输入图片说明


3
很棒的答案!做得好。但是我有一个问题。UITextView如果clipsToBounds属性等于,为什么阴影不可见true??如果是false,则效果很好
曼诺普森(Mannopson)'17

1
注意:在其上更改clipsToBounds的父视图。因此,如果viewB是viewA的子视图。viewA需要将clipsToBounds设置为真。
aestusLabs

从该视图的原始视图框架显示的那个视图是轻击手势,因为我检查了它并且不起作用。
Pravin Tate

2

这是一个简短的快速答案,而不是公认的答案

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

我只是在我们的代码中遇到了一个错误。父视图的高度设置为的位置0。我们希望没有任何元素。然而,父视图的内容却出现了。

这是因为clipToBounds没有设置为true。一旦将其设置为true,子视图的高度就不能超出0,因此它们根本不会显示。


这个答案被低估了
sasquatch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.