SwiftUI — ToolbarItemGroup

ToolbarItemGroup 是用于在工具栏中组织多个相关项目的容器。它允许你将多个工具栏项目组合在一起,并统一设置它们的位置和样式。

1. 基本用法 #

NavigationStack {
    List {
        Text("内容")
    }
    .toolbar {
        ToolbarItemGroup(placement: .navigationBarTrailing) {
            Button("编辑") { }
            Button("分享") { }
        }
    }
}

2. 不同位置的使用 #

struct ContentView: View {
    var body: some View {
        NavigationStack {
            List {
                Text("内容")
            }
            .navigationTitle("主页")
            .toolbar {
                // 1. 导航栏右侧组
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Button(action: { }) {
                        Image(systemName: "square.and.arrow.up")
                    }
                    Button(action: { }) {
                        Image(systemName: "ellipsis")
                    }
                }
                
                // 2. 底部工具栏组
                ToolbarItemGroup(placement: .bottomBar) {
                    Button("取消") { }
                    Spacer()
                    Button("确定") { }
                }
                
                // 3. 键盘工具栏组
                ToolbarItemGroup(placement: .keyboard) {
                    Spacer()
                    Button("完成") { }
                }
            }
        }
    }
}

3. 实际应用示例 #

示例1:编辑界面工具栏 #

struct EditView: View {
    @State private var isEditing = false
    @State private var showShareSheet = false
    
    var body: some View {
        NavigationStack {
            List {
                Text("编辑内容")
            }
            .navigationTitle("编辑")
            .toolbar {
                // 顶部工具栏组
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Button(action: { showShareSheet = true }) {
                        Image(systemName: "square.and.arrow.up")
                    }
                    Button(action: { isEditing.toggle() }) {
                        Image(systemName: isEditing ? "checkmark" : "pencil")
                    }
                }
                
                // 底部工具栏组
                ToolbarItemGroup(placement: .bottomBar) {
                    Button(action: { }) {
                        Image(systemName: "bold")
                    }
                    Button(action: { }) {
                        Image(systemName: "italic")
                    }
                    Button(action: { }) {
                        Image(systemName: "underline")
                    }
                    Spacer()
                    Button(action: { }) {
                        Image(systemName: "photo")
                    }
                }
            }
        }
    }
}

示例2:键盘工具栏 #

struct MessageView: View {
    @State private var text = ""
    
    var body: some View {
        NavigationStack {
            TextField("输入消息", text: $text)
                .textFieldStyle(.roundedBorder)
                .padding()
                .toolbar {
                    ToolbarItemGroup(placement: .keyboard) {
                        Button(action: { }) {
                            Image(systemName: "photo")
                        }
                        Button(action: { }) {
                            Image(systemName: "camera")
                        }
                        Spacer()
                        Button("发送") { }
                    }
                }
        }
    }
}

示例3:复杂布局工具栏 #

struct ComplexToolbarView: View {
    @State private var selectedColor = Color.blue
    
    var body: some View {
        NavigationStack {
            List {
                Text("内容")
            }
            .navigationTitle("高级编辑")
            .toolbar {
                // 顶部左侧工具栏组
                ToolbarItemGroup(placement: .navigationBarLeading) {
                    Button("取消") { }
                }
                
                // 顶部右侧工具栏组
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Button("保存") { }
                }
                
                // 底部工具栏组 - 样式工具
                ToolbarItemGroup(placement: .bottomBar) {
                    Group {
                        Button(action: { }) {
                            Image(systemName: "textformat")
                        }
                        Button(action: { }) {
                            Image(systemName: "bold")
                        }
                        Button(action: { }) {
                            Image(systemName: "italic")
                        }
                    }
                    .buttonStyle(.bordered)
                    
                    Spacer()
                    
                    // 颜色选择器组
                    Group {
                        ColorPicker("", selection: $selectedColor)
                        Button(action: { }) {
                            Image(systemName: "photo")
                        }
                    }
                    .buttonStyle(.bordered)
                }
            }
        }
    }
}

示例4:自适应工具栏组 #

struct AdaptiveToolbarView: View {
    @Environment(\.horizontalSizeClass) private var horizontalSizeClass
    
    var body: some View {
        NavigationStack {
            List {
                Text("内容")
            }
            .navigationTitle("自适应布局")
            .toolbar {
                // 根据屏幕大小调整工具栏布局
                ToolbarItemGroup(placement: horizontalSizeClass == .compact ? .bottomBar : .navigationBarTrailing) {
                    Button(action: { }) {
                        Image(systemName: "square.and.arrow.up")
                    }
                    Button(action: { }) {
                        Image(systemName: "heart")
                    }
                    Button(action: { }) {
                        Image(systemName: "message")
                    }
                }
            }
        }
    }
}

示例5:分段工具栏组 #

struct SegmentedToolbarView: View {
    @State private var selectedTab = 0
    
    var body: some View {
        NavigationStack {
            List {
                Text("内容")
            }
            .navigationTitle("分段工具栏")
            .toolbar {
                // 顶部工具栏组
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    Picker("选择视图", selection: $selectedTab) {
                        Image(systemName: "list.bullet").tag(0)
                        Image(systemName: "square.grid.2x2").tag(1)
                    }
                    .pickerStyle(.segmented)
                }
                
                // 底部工具栏组
                ToolbarItemGroup(placement: .bottomBar) {
                    ForEach(0..<4) { index in
                        Button(action: { }) {
                            Image(systemName: "circle.fill")
                        }
                        if index < 3 {
                            Spacer()
                        }
                    }
                }
            }
        }
    }
}

4. 使用建议 #

  1. 合理分组
.toolbar {
    // 相关功能放在同一组
    ToolbarItemGroup(placement: .bottomBar) {
        // 编辑相关
        Group {
            Button("剪切") { }
            Button("复制") { }
            Button("粘贴") { }
        }
        
        Spacer()
        
        // 格式相关
        Group {
            Button("字体") { }
            Button("颜色") { }
        }
    }
}
  1. 布局控制
.toolbar {
    ToolbarItemGroup(placement: .bottomBar) {
        // 使用 Spacer 控制布局
        Button("左边") { }
        Spacer()
        Button("中间") { }
        Spacer()
        Button("右边") { }
    }
}
  1. 状态管理
@State private var isEditing = false

.toolbar {
    ToolbarItemGroup(placement: .navigationBarTrailing) {
        // 根据状态显示不同按钮
        if isEditing {
            Button("完成") { isEditing = false }
        } else {
            Button("编辑") { isEditing = true }
        }
    }
}

5. 注意事项 #

  1. 避免过度使用

    • 保持工具栏简洁
    • 只显示最重要的功能
  2. 合理分组

    • 相关功能放在一起
    • 使用适当的间距
  3. 适配不同设备

    • 考虑不同屏幕大小
    • 适当调整布局
  4. 可访问性

    • 添加适当的标签
    • 确保足够的点击区域
  5. 性能考虑

    • 避免在工具栏中放置复杂视图
    • 注意内存使用

通过这些示例和建议,你可以更好地理解和使用 ToolbarItemGroup 来创建组织良好的工具栏界面。

本文共 1592 字,上次修改于 Jan 5, 2025