注意:原文章標題為「Java 線程掛起/恢復/終止」,但內容實為 iOS Auto Layout 教學。本文依實際內容重寫。
Auto Layout 是 Apple 於 iOS 6 (Xcode 5) 引入的佈局系統,解決多螢幕尺寸 (3.5" → 4" → 4.7" → 5.5" → 刘海屏 → Dynamic Island) 適配難題。採用「約束式佈局」,透過描述視圖間的幾何關係,由系統自動計算 Frame,取代傳統手動計算座標的「笨方法」。
約束是描述視圖屬性關係的線性方程式:
view1.attribute1 = multiplier × view2.attribute2 + constant
屬性包含:leading, trailing, top, bottom, width, height, centerX, centerY 等。
在 Storyboard 拖入 UIButton,設定背景色、文字色、標題 "Swift on iOS"。
點選按鈕 → 點擊右下角 Align (第 2 個圖示) → 勾選 Horizontally in Container (水平置中) → Add 1 Constraint。
點選按鈕 → 點擊右下角 Pin (第 1 個圖示) → 設定:
點擊 Add 4 Constraints。
在 Interface Builder 底部裝置列切換:
按鈕應自動調整寬度,保持左右間距、固定高度、水平置中。
一個視圖在父視圖中需要確定 4 個自由度:X 座標、Y 座標、寬度、高度。
| 約束 | 決定屬性 |
|---|---|
| Horizontally in Container | centerX → 決定 X 座標 |
| Leading Space to Superview | left 邊界 |
| Trailing Space to Superview | right 邊界 → 與 left 決定寬度 |
| Height = 44 | 固定高度 |
這就是「嚴格約束」:視圖在任意螢幕尺寸下位置大小唯一確定,無法縮放移動。
需求:三個視圖等寬、等間距、固定高度,左右貼邊或留白。
Width Equally 約束 (選中三視圖 → Pin → Equal Widths)。若需求為「固定寬高比」(如 16:9 影片區),改用 Aspect Ratio 約束,而非固定 Height。
Required (1000),可選約束降低優先級 (如 950, 750)。UIStackView,自動管理子視圖間距、對齊、分佈,大幅減少手動約束。NSLayoutConstraint.activate([...]) 或 SnapKit、PureLayout 等 DSL 庫,比 IB 更可維護。| 現象 | 原因 | 解決 |
|---|---|---|
| 執行時 Console 輸出 "Unable to simultaneously satisfy constraints" | 約束衝突 (過度約束或矛盾) | 點擊錯誤日誌中的約束 ID,在 IB 中高亮檢視,移除或降低優先級 |
| 視圖位置錯誤/重疊 | 約束不足 (欠約束) | 檢查是否缺少 X/Y/Width/Height 四個自由度的約束 |
| 安全區域遮擋 (刘海屏/指示器) | 約束相對 Superview 而非 Safe Area | Pin/Align 時勾選 "Safe Area Layout Guide" (iOS 11+) |
| 動畫後佈局錯亂 | 動畫修改 Frame 而非約束常數 | 修改 constraint.constant 後呼叫 layoutIfNeeded() 在動畫區塊內 |
iOS 13+ 推出 SwiftUI,採用宣告式語法,內建自適應佈局 (VStack/HStack/ZStack),是未來主流。但 Auto Layout 仍將長期存在於存量專案與 UIKit 混合開發中,深入掌握約束系統對資深 iOS 工程師依然必須。
建議學習路徑:Storyboard 入門理解約束 → 代碼手寫約束掌握本質 → Stack View 提升效率 → SwiftUI 拥抱未來。