1. 程式人生 > >Auto Layout 的元件該在何時設定圓角的 layer.cornerRadius

Auto Layout 的元件該在何時設定圓角的 layer.cornerRadius

利用 UIView 的 layer.cornerRadius,我們可以設定元件的圓角,比方將正方形元件的 cornerRadius 設為它寬度的一半,將它變成圓形。

然而當元件的大小由 Auto Layout 設定,隨著不同的 iPhone 尺寸改變大小時,我們就不能寫死 cornerRadius 了。我們必須等 Auto Layout 算出元件的大小後,再計算 cornerRadius。所以計算 cornerRadius 的程式要寫在哪呢 ? 接下來我們將以米老鼠圖片變圓形為例,瞧瞧兩種不同的寫法。

1 在 controller 的 function viewDidLayoutSubviews 裡計算 cornerRadius。
class ViewController: UIViewController {
   @IBOutlet var mickyImageView: CircleImageView!
   override func viewDidLayoutSubviews() {
      super.viewDidLayoutSubviews()
      mickyImageView.layer.cornerRadius = mickyImageView.bounds.midX
   }

viewDidLayoutSubviews() 是 UIViewController 的 function,當它執行時,controller 畫面上的元件都已依 auto layout 的 constraint 得到位置大小,因此我們可用 mickyImageView.layer.cornerRadius = mickyImageView.bounds.midX

計算 cornerRadius。

除了利用 midX,也可以用寬度除以 2 的寫法。

mickyImageView.layer.cornerRadius = mickyImageView.bounds.width / 2
2 自訂 View 元件的類別 ,在 function layoutSubviews 裡計算 cornerRadius。
class CircleImageView: UIImageView {
   override func layoutSubviews() {
      super.layoutSubviews()
      layer.cornerRadius = bounds.midX
   }
}

layoutSubviews() 是 UIView 的 function,當它執行時,它會依據 auto layout 的 constraint 排版 subviews。當我們在 function layoutSubviews 的super.layoutSubviews() 後寫程式時,此時元件 self 自己和它的 subviews 都已依 auto layout 的 constraint 得到位置大小,因此我們可用 layer.cornerRadius = bounds.midX 計算 cornerRadius。