作為一個現代化的平臺, iOS的發展也經歷了好幾個時代.
本文講講iOS寫UI的幾種主要方式和各自的特點.
在iOS中寫UI有多種選擇, 大的分類: 使用UIKit還是SwiftUI.
在使用UIKit的情形下, 還根據是否使用storyboard來區分.
注意: 以上的幾種方式在專案裡可能是混合使用的, 所以建議都瞭解.
UIKit是蘋果官方的framework, 其中包含了UI元件和各種基礎設施支援, 是傳統的iOS開發離不開的一套類庫.
UIViewController就屬於UIKit.
我們新建的專案, 如果不選SwiftUI, 都會帶一個main storyboard.
用Storyboard寫UI大致分為這幾步:
Cmd + Shift + L
可以撥出選單. 可以新增View或者新的View Controller.Ctrl + 拖拽
生成outlet(用於控制控制元件本身屬性)或者action(控制元件的點選事件).(這一步也不是必須這樣做, 也可以先手寫出outlet程式碼, 然後拖拽連起來.)
優點:
缺點: 因為程式碼是一個xml檔案中track, 在團隊合作容易產生不好解決的衝突.
首先, 在loadView()
中設定view:
override func viewDidLoad() {
super.viewDidLoad()
view = UIView()
view.backgroundColor = .white
}
然後不斷地addSubview()
進去.
其中子view可以是controller中宣告的欄位:
var myLabel: UILabel!
這裡加上感嘆號有kotlin中類似lateinit的作用, 否則會提示controller沒有init方法.
之後再新增Constraints.
優點: 都用程式碼寫, 歷史清晰, 衝突好解決.
缺點: 要用程式碼寫約束; 寫起來比較囉嗦; 執行之後才能看到實際的效果.
SwiftUI是iOS新推出的宣告式的寫UI的方式, 可以類比Android的Jetpack Compose.
新建專案以後的Hello World大概長這樣:
App:
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
ContentView:
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
優點:
缺點: