iOS swiftUI的实用举例

SwiftUI 是 Apple 推出的声明式 UI 框架,以下是一些实用技巧和最佳实践,可以帮助你更高效地开发 iOS/macOS/watchOS/tvOS 应用。

1. 布局技巧

灵活的空间占用

swift 复制代码
// 使用 Spacer 填充可用空间 
HStack {
    Text("Left")
    Spacer() // 填充中间空间 
    Text("Right")
}
 
// 使用 frame 控制视图大小 
Text("Hello")
    .frame(maxWidth: .infinity, maxHeight: .infinity) // 填充父视图 
    .background(Color.yellow)

条件显示视图

swift 复制代码
@State private var isShowing = false 
 
var body: some View {
    VStack {
        if isShowing {
            Text("Visible")
        } else {
            EmptyView()
        }
        
        // 或者使用更简洁的方式 
        isShowing ? Text("Visible") : nil 
    }
}

2. 状态管理

使用 @State 和 @Binding

swift 复制代码
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

swift 复制代码
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. 列表与导航

动态列表

swift 复制代码
struct ContentView: View {
    let items = ["Apple", "Banana", "Cherry"]
    
    var body: some View {
        List(items, id: \.self) { item in 
            Text(item)
        }
    }
}

带删除和移动功能的列表

swift 复制代码
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. 动画与过渡

简单动画

swift 复制代码
@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)
}

自定义过渡

swift 复制代码
@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. 实用修饰符

同时应用多个修饰符

swift 复制代码
Text("Hello")
    .modifier(MyCustomModifier())
 
// 或者使用扩展 
extension View {
    func customStyle() -> some View {
        self 
            .padding()
            .background(Color.blue)
            .foregroundColor(.white)
            .cornerRadius(10)
    }
}
 
Text("Hello").customStyle()

条件修饰符

swift 复制代码
@State private var isHighlighted = false 
 
var body: some View {
    Text("Hello")
        .foregroundColor(isHighlighted ? .red : .blue)
        .onTapGesture {
            isHighlighted.toggle()
        }
}

6. 性能优化

使用 Lazy 视图

swift 复制代码
ScrollView {
    LazyVStack { // 只渲染可见项 
        ForEach(0..<1000) { index in 
            Text("Row \(index)")
        }
    }
}

使用 EquatableView 避免不必要重绘

swift 复制代码
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()
  1. 与其他框架集成

与 UIKit 集成

swift 复制代码
struct MyUIKitView: UIViewRepresentable {
    func makeUIView(context: Context) -> UIActivityIndicatorView {
        UIActivityIndicatorView(style: .large)
    }
    
    func updateUIView(_ uiView: UIActivityIndicatorView, context: Context) {
        uiView.startAnimating()
    }
}
 
// 使用 
MyUIKitView()

与 Core Data 集成

swift 复制代码
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. 调试技巧

调试视图层次结构

swift 复制代码
Text("Hello")
    .debug() // 添加这个修饰符查看视图信息 
 
extension View {
    func debug() -> Self {
        print(Mirror(reflecting: self).subjectType)
        return self 
    }
}

预览多个设备

swift 复制代码
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 会议视频以获取最新信息。

相关推荐
传奇开心果编程5 小时前
【SwiftUI提高练中学】第9课 安全与隐私
swiftui·移动开发·swift·编程语言理论·开发范式·编程框架·声明式ui
CocoaKier6 小时前
苹果商店详情顶部头图已面向所有开发者开放!
ios·apple
茶底世界之下6 小时前
同一张街拍,两种表达:用 Awaking 试一次高对比黑白
ios
调试人生的显微镜9 小时前
iOS开发入门:Interface Builder、基础控件及UITextField详解
后端·ios
茶底世界之下15 小时前
动态切换 nearest / linear 时,为什么不能只替换 sampler
ios·swift
应用市场19 小时前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
传奇开心果编程21 小时前
【声明式UI开发实用技术学与练】第8课 状态提升与下放
学习·flutter·react native·ui·swiftui·composer
东坡肘子21 小时前
Swift Server,又多了一个 Google -- 肘子的 Swift 周报 #156
人工智能·swiftui·swift
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
打工仔折腾 AI2 天前
从零写一个CAD 05:以鼠标为中心的滚轮缩放,招法能复用但顺序不能反
开发语言·后端·python·性能优化·计算机外设·swift·ai agent 实战