在为子视图添加图层蒙版时,为什么需要调用layoutIfNeeded()?

时间:2017-02-28 22:34:18

标签: ios swift uiview calayer

我的主视图有一个子视图,我使用以下扩展名添加了一个掩码:

extension UIView{
func addTopRoundCorners(){
    let bezierPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: [UIRectCorner.topLeft, UIRectCorner.topRight], cornerRadii: CGSize(width: 20, height: 20))
    let maskLayer = CAShapeLayer()
    maskLayer.path = bezierPath.cgPath
    maskLayer.fillColor = UIColor.red.cgColor
    self.layer.mask = maskLayer
}

}

我注意到,如果我在主视图上调用layoutIfNeeded()之前,此代码对我的子视图的影响只会显示在屏幕上,然后再将掩码添加到我的子视图中。如果有人能向我解释为什么会这样,我真的很感激?

1 个答案:

答案 0 :(得分:0)

layoutIfNeeded将计算视图的位置和大小。如果您在计算最终位置和尺寸之前调用addTopRoundCorners()函数,那么用于创建self.bounds的{​​{1}}将会出错。

自动布局不会自动调整遮罩层的大小,也不会调用UIBezierPath来重新创建路径。