SwiftUI-Group

今天讨论三个SwiftUI中比较常用的Group Component,分别是Group、GroupBox和ControlGroup(这么看好像是一个😂)

Group

Group跟XStack这类组件有点类似,但它并不会对child有layout上的影响,它只是提供了一个对其内部所有child统一应用某个modifier的快捷方式

swift 复制代码
Group {    
    Text("First")    
    Text("Second View")    
    Text("Third View")
}
.background(Color.yellow)

这样应该比较容易看得清楚。不同于VStack、HStack这类组件,他们会将modifier直接作用在stack自身上,而不是loop到内部的child身上

GroupBox

GroupBox允许开发者设置样式、组织内部child的Layout,比较常用的场景是构建Card类的UI

swift 复制代码
@State private var userAgreed: Bool = false
let agreementText: String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam fermentum vestibulum est. Cras rhoncus. Pellentesque habitant mobi tristique senectus et netus et malesuada fames ac turpis egestas."
var body: some View {
    GroupBox(label: Label("End-User Agreement", systemImage: "building.columns"), content: {
            
        Text(agreementText)
            .font(.footnote)
        Toggle(isOn: $userAgreed, label: {
                Text("I agree to the above terms")
        })
    })
    .groupBoxStyle(.automatic)
    .padding()
}

groupBoxStyle里面也可以用自己自定义的样式,只需要继承GroupBoxStyle,func makeBody(configuration: Configuration) -> some View方法。

swift 复制代码
struct OrangeGroupBoxStyle: GroupBoxStyle {
    func makeBody(configuration: Configuration) -> some View {
        VStack(alignment: .leading) {
            configuration.label
                .font(.title)
            configuration.content
        }
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 5.0)
                .fill(Color.orange)
                .shadow(radius: 5)
        )
    }
}

替换 groupBoxStyle的modifier参数,效果如下

ControlGroup

常用于把类似操作功能的Component集中管理,它也会提供一些已经实现好的默认style,比如navigation、compactMenu这些

swift 复制代码
ControlGroup {
    Button("First"){}
    Button("Second"){}
    Button("Third"){}
}

ControlGroup {
    Button("First"){}
    Button("Second"){}
    Button("Third"){}
} label: {
    Label("Plus", systemImage: "plus")
}
.controlGroupStyle(.menu)
.padding()

这是一种没使用style,和一种使用了menu的style的效果

它跟GroupBox一样提供了自定义style的方式,也是继承protocol

swift 复制代码
struct EqualSizeControlGroupStyle: ControlGroupStyle {
    func makeBody(configuration: Configuration) -> some View {
        VStack {
            configuration.content
                .foregroundColor(.white)
                .padding(.vertical, 5)
                .padding(.horizontal, 10)
                .frame(maxWidth: .infinity)
                .background(
                    RoundedRectangle(cornerRadius: 5)
                        .fill(Color.accentColor)
                )
        }
        .fixedSize(horizontal: true, vertical: false)
    }
}

修改controlGroupStyle这个modifier的参数,传入自己的style实例,效果如下

这个自定义的空间很大,完全取决于自己的设计了。后面有对这些组件有比较好的应用场景的例子会在补充进来

相关推荐
懋学的前端攻城狮19 小时前
把 SwiftUI List 换成 NSTableView:一次目录树卡顿的排查记录
macos·swiftui·swift
东坡肘子2 天前
AI 想放弃了,人没有 -- 肘子的 Swift 周报 #150
人工智能·swiftui·swift
东坡肘子9 天前
越来越慢的 App Review,拦住了谁? -- 肘子的 Swift 周报 #149
人工智能·swiftui·swift
大熊猫侯佩14 天前
Xcode 预览新升级:arguments 让界面调试井井有条
swiftui·xcode·swift
大熊猫侯佩15 天前
WWDC26:把 SwiftUI Toolbar 真正握在手心里
swiftui·swift·apple
大熊猫侯佩15 天前
WWDC 26 全新 ResultsObserver:终于能在 View 外面盯着 SwiftData 了
swiftui·swift·apple
东坡肘子16 天前
Apple Intelligence 已通过审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148
人工智能·swiftui·swift
2501_9151063221 天前
SwiftUI项目创建详解:使用Xcode从零开始创建第一个App项目
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
东坡肘子23 天前
热茶还是冰咖啡 -- 肘子的 Swift 周报 #147
人工智能·swiftui·swift
2501_916007471 个月前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程