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实例,效果如下

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

相关推荐
CYpdpjRnUE2 天前
光伏电池PV建模及其基于Boost Buck电路的最大功率追踪MPPT算法研究及仿真效果探究
swiftui
初级代码游戏3 天前
iOS开发 SwiftUI 15:手势 拖动 缩放 旋转
ios·swiftui·swift
zhyongrui5 天前
SnipTrip 菜单 Liquid Glass 实现方案:结构、材质、交互与深浅色策略
ios·性能优化·swiftui·交互·开源软件·材质
zhyongrui5 天前
SnipTrip 不发烫的实现路径:局部刷新 + 合成缓存 + 峰值削减
ios·swiftui
初级代码游戏6 天前
iOS开发 SwiftUI 14:ScrollView 滚动视图
ios·swiftui·swift
初级代码游戏6 天前
iOS开发 SwitftUI 13:提示、弹窗、上下文菜单
ios·swiftui·swift·弹窗·消息框
zhyongrui6 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
zhyongrui7 天前
SnipTrip 发热优化实战:从 60Hz 到 30Hz 的性能之旅
ios·swiftui·swift
大熊猫侯佩8 天前
赛博深渊(上):用 Apple Foundation Models 提炼“禁忌知识”的求生指南
llm·swiftui·大语言模型·foundationmodel·apple ai·apple 人工智能·summarize
zhyongrui9 天前
SwiftUI 光晕动画性能优化:消除托盘缩放卡顿的实战方案
ios·性能优化·swiftui