SwiftUI 是 Apple 推出的聲明式 UI 框架,以下是一些實用技巧和最佳實踐,可以幫助你更高效地開發 iOS/macOS/watchOS/tvOS 應用。
1. 布局技巧
靈活的空間占用
// 使用 Spacer 填充可用空間
HStack {Text("Left")Spacer() // 填充中間空間 Text("Right")
}// 使用 frame 控制視圖大小
Text("Hello").frame(maxWidth: .infinity, maxHeight: .infinity) // 填充父視圖 .background(Color.yellow)
條件顯示視圖
@State private var isShowing = false var body: some View {VStack {if isShowing {Text("Visible")} else {EmptyView()}// 或者使用更簡潔的方式 isShowing ? Text("Visible") : nil }
}
2. 狀態管理
使用 @State 和 @Binding
struct ParentView: View {@State private var text = ""var body: some View {VStack {Text("Parent: \(text)")ChildView(text: $text) // 傳遞綁定 }}
}struct ChildView: View {@Binding var text: String var body: some View {TextField("Enter text", text: $text)}
}
使用 @ObservedObject 和 @Published
class UserSettings: ObservableObject {@Published var score = 0
}struct ContentView: View {@ObservedObject var settings = UserSettings()var body: some View {VStack {Text("Score: \(settings.score)")Button("Increase") {settings.score += 1 }}}
}
3. 列表與導航
動態列表
struct ContentView: View {let items = ["Apple", "Banana", "Cherry"]var body: some View {List(items, id: \.self) { item in Text(item)}}
}
帶刪除和移動功能的列表
struct ContentView: View {@State private var items = ["Apple", "Banana", "Cherry"]var body: some View {NavigationView {List {ForEach(items, id: \.self) { item in Text(item)}.onDelete(perform: deleteItems).onMove(perform: moveItems)}.navigationBarItems(trailing: EditButton())}}func deleteItems(at offsets: IndexSet) {items.remove(atOffsets: offsets)}func moveItems(from source: IndexSet, to destination: Int) {items.move(fromOffsets: source, toOffset: destination)}
}
4. 動畫與過渡
簡單動畫
@State private var scale: CGFloat = 1.0 var body: some View {Button("Tap Me") {withAnimation(.spring()) {scale = scale == 1.0 ? 2.0 : 1.0 }}.scaleEffect(scale)
}
自定義過渡
@State private var showDetails = false var body: some View {VStack {Button("Toggle") {withAnimation {showDetails.toggle()}}if showDetails {Text("Details").transition(.asymmetric(insertion: .move(edge: .leading),removal: .move(edge: .trailing)))}}
}
5. 實用修飾符
同時應用多個修飾符
Text("Hello").modifier(MyCustomModifier())// 或者使用擴展
extension View {func customStyle() -> some View {self .padding().background(Color.blue).foregroundColor(.white).cornerRadius(10)}
}Text("Hello").customStyle()
條件修飾符
@State private var isHighlighted = false var body: some View {Text("Hello").foregroundColor(isHighlighted ? .red : .blue).onTapGesture {isHighlighted.toggle()}
}
6. 性能優化
使用 Lazy 視圖
ScrollView {LazyVStack { // 只渲染可見項 ForEach(0..<1000) { index in Text("Row \(index)")}}
}
使用 EquatableView 避免不必要重繪
struct UserView: View, Equatable {let user: User var body: some View {Text(user.name)}static func == (lhs: UserView, rhs: UserView) -> Bool {lhs.user.id == rhs.user.id }
}// 使用
UserView(user: someUser).equatable()
- 與其他框架集成
與 UIKit 集成
struct MyUIKitView: UIViewRepresentable {func makeUIView(context: Context) -> UIActivityIndicatorView {UIActivityIndicatorView(style: .large)}func updateUIView(_ uiView: UIActivityIndicatorView, context: Context) {uiView.startAnimating()}
}// 使用
MyUIKitView()
與 Core Data 集成
struct ContentView: View {@Environment(\.managedObjectContext) private var viewContext @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],animation: .default)private var items: FetchedResults<Item>var body: some View {List {ForEach(items) { item in Text("Item at \(item.timestamp!, formatter: itemFormatter)")}.onDelete(perform: deleteItems)}}private func deleteItems(offsets: IndexSet) {withAnimation {offsets.map { items[$0] }.forEach(viewContext.delete)try? viewContext.save()}}
}
8. 調試技巧
調試視圖層次結構
Text("Hello").debug() // 添加這個修飾符查看視圖信息 extension View {func debug() -> Self {print(Mirror(reflecting: self).subjectType)return self }
}
預覽多個設備
struct ContentView_Previews: PreviewProvider {static var previews: some View {Group {ContentView().previewDevice("iPhone 13")ContentView().previewDevice("iPhone SE (2nd generation)")ContentView().previewDevice("iPad Pro (12.9-inch) (5th generation)")}}
}
這些技巧可以幫助你更高效地使用 SwiftUI 構建應用程序。SwiftUI 仍在快速發展,建議定期查看 Apple 的官方文檔和 WWDC 會議視頻以獲取最新信息。