clipsToBounds如何工作?

时间:2013-12-08 02:42:36

标签: ios uiview uikit frame bounds

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

官方文件说明如下:

  

clipsToBounds property

     

一个布尔值,用于确定子视图是否仅限于   观点的界限。

     

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

但我不清楚这究竟意味着什么。我应该如何使用clipsToBounds?将此属性设置为YES的确切后果是什么?或NO

3 个答案:

答案 0 :(得分:251)

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

作为一个直观的例子,请考虑在故事板上设置以下视图:

enter image description here

这是一个白色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
}

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

enter image description here

因此,尽管这些视图设置相同(clipsToBounds除外),但它们看起来不同。这就是clipsToBounds的作用。将其设置为YES将提供最佳结果,而将其设置为NO会提供最终结果。

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

enter image description here

答案 1 :(得分:4)

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

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

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

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

答案 2 :(得分:0)

带有阴影Swift 4的uiview和文本字段

self.txtCurrent.layer.shadowOpacity = 0.5
self.txtCurrent.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)          
self.txtCurrent.layer.shadowRadius = 5.0
self.txtCurrent.layer.shadowColor = UIColor.black.cgColor
self.txtCurrent.layer.masksToBounds = false

带有阴影的uiview

self.yourview.layer.shadowOpacity = 0.5
self.yourview.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
self.yourview.layer.shadowRadius = 5.0
self.yourview.layer.shadowColor = UIColor.black.cgColor
self.yourview.layer.masksToBounds = false