2017-02-28 82 views
0

我的主要觀點有一個子視圖,這是我一個面具添加到使用以下擴展名:爲什麼在向子視圖添加圖層蒙版時需要調用layoutIfNeeded()?

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()在我的主視圖中,然後將遮罩添加到我的子視圖中。我真的很感激,如果有人能向我解釋爲什麼這是?

+0

你在使用autolayouts嗎? – apineda

+0

您如何理解視圖生命週期?從根本上說,你告訴操作系統重新繪製需要的東西。 – dfd

+0

是的,我正在使用自動佈局。但是,我通過代碼而不是故事板添加了它們。我也知道在使用自動佈局時,爲了使掩碼工作,您必須調用'layoutIfNeeded()',但爲什麼? @apineda –

回答

0

layoutIfNeeded將計算您的視圖的位置和大小。如果您在計算最終位置和大小之前調用您的addTopRoundCorners()函數,那麼用於創建UIBezierPathself.bounds將是錯誤的。

自動佈局不會自動調整您的遮罩層的大小,也不會呼叫addTopRoundCorners重新創建路徑。

相關問題