How I AutoLayout Programmatically

Ways to set AutoLayout

設定 AutoLayout 兩種方式:Storyboard/Programmatically

起初在學習 AutoLayout 時,使用 Storyboard 設定條件,易讀性高。當輸入過多或缺少的條件時還會出現紅/黃線警示你,但沒出現紅線也不表示設定的條件沒有問題,還是有機會出現隱藏錯誤。

理解 AutoLayout 原理後,開始嘗試著以程式做 AutoLayout,兩種方式差別只在於一種是用 storyboard 拉條件,一種是寫出設定條件。這篇文章則是記錄我如何以程式做 AutoLayout ,如還不熟 AutoLayout 拉條件原理,建議可以多在 storyboard 上操作練習。

How I do AutoLayout Programmatically

以此為例:設定 UIImageView 畫面顯示與螢幕同大小。

1. AutoResize:
以程式寫出元件條件時,須將該元件的 AutoResize 關閉,否則將會造成衝突。

imageView.translatesAutoresizingMaskIntoConstraints = false

2. NSLayoutConstraint:
設定元件條件。

我會將要設定的元件寫在 function 裡面,要修改條件時也方便找尋。

條件設定:

・對齊一邊 leading, trailing, top, bottom

imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor)

・水平垂直位置 centerX, centerY

imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor)

・設定寬高 width, height

//直接輸入值
imageView.heightAnchor.constraint(equalToConstant: 30)
//或是與同值
imageView.heightAnchor.constraint(equalTo: view.widthAnchor)
//也可以
imageView.heightAnchor.constraint(equalTo: view.widthAnchor, multiplier: 16/9)

實作 AutoLayout 常遇到的問題

不論是在 storyboard 上或是 programmatically 設定 AutoLayout,時常會遇到下方印出一串表示設定的條件遇到衝突等等的字串,要你自己去檢查,有時可以正常跑起來,有時又跑版… (汗)

  1. 程式設定條件時,首先檢查是否將 AutoResizing 關閉。
  2. 是否重複設定了條件。
    如下圖,可以發現我們設定上下左右對齊畫面上下左右,但在最後一行又設定了圖片的高等於圖片的寬,因此將會造成衝突。

3. 看懂印出的衝突在說什麼。

「 H: 」表示水平
「 V: 」表示垂直
「 | 」 符號表示描述view之superview邊界
|- [label] 槓槓-表示距離為 8 (default)
|-(0)-[label] 表示距離為 0
H:|-[label(20)]-(0)-[button]-| 兩元件間無距離仍須寫出,非[label][button]
H:|-[label(20)]-| 需有頭有尾,需給元件尺寸,水平即寬,不給則是自動長
H:|-[label(==button)]-| 支援==、>=、<= 符號,表示與某元件等寬
此圖為第二點執行後,印出的衝突內容。

AutoLayout: CollectionView & TableView

最後,為何會特別提出 Table View 和 Collection View 呢?這可是我真真實實踩過的坑啊🥲 寫這篇就是怕自己如果忘記了可以回來看的小寶典呀!基本上 AutoLayout 方式不變,但就是要加上一些條件,否則將又會印出一堆文字。

🌟 Collection View 要設定 UICollectionViewFlowLayout

設定大小 itemSize ,預估大小為零 estimatedItemSize = .zero , 間距 sectionInset
參考彼得潘的這篇文章:「利用 flow layout 的 collection view 製作照片牆」

🌟 Table View 要設定 row 高

可以參考彼得潘的這篇文章:「 如何讓 table view cell 固定高度 」

--

--