SwiftUI 的 Spacer 的替代品

根据Apple的文档介绍 Spacer是:

一种灵活的空间,可沿其包含的堆栈布局的主轴扩展,或者如果未包含在堆栈中,则可在两个轴上扩展。

那么让我们开始一个创建一个简单的HStack,并且使用可以使用修饰符.frame(maxWidth:maxHeight:alignment:)实现相同的效果。

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Text("Taylor")
        }
        .border(.blue)
        .padding()
    }
}

1、在前面添加

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Spacer()
            Image(systemName: "checkmark")
            Text("Taylor")
        }
        .border(.blue)
        .padding()
    }

通过设置maxWidth.infinity,我们表明容器视图应使用尽可能多的水平空间。

对齐.trailing将确保内容与尾端对齐。

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Text("Taylor")
        }
        .border(.blue)
        .padding()
        .frame(maxWidth: .infinity, alignment: .trailing)
    }
}

2、在中间添加

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Spacer()
            Text("Taylor")
        }
        .border(.blue)
        .padding()
    }
}

只需frame在trailing其中之一上使用修饰符并设置所需的对齐方式即可。

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Text("Taylor")
                .frame(maxWidth: .infinity, alignment: .trailing)
        }
        .border(.blue)
        .padding()
    }
}

3、在尾部添加

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Text("Taylor")
            Spacer()
        }
        .border(.blue)
        .padding()
    }
}

可以选择使用.leading对齐方式。

css 复制代码
struct ContentView: View {
    var body: some View {
        HStack {
            Image(systemName: "checkmark")
            Text("Taylor")
        }
        .border(.blue)
        .padding()
        .frame(maxWidth: .infinity, alignment: .leading)
    }
}

区别

从视觉上看,两种方法看起来完全相同(如果您忘记了蓝色边框,它只是为了了解所有这些的行为)。但现在,您直接在容器上设置行为,而不是在其中添加额外的灵活组件。

因此,使用.frame修饰符会比 a 节省很多性能Spacer,特别是在列表或长水平/垂直堆栈中。

结论

当然,Spacer在更复杂的组件中仍然有用。但我的建议是,Spacer为了性能成本和可读性,尽量少用。

我也只在我的代码示例中使用HStack这里,但处理与参数和某些或对齐VStack基本相同。maxHeight``.top``.bottom

对于更复杂的组件,您还可以将水平和垂直对齐方式与.topLeading.topTrailing.bottomLeading或对齐.bottomTrailing方式结合起来.center

相关推荐
TT_Close4 天前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
张江4 天前
Swift Concurrency学习
swift
东坡肘子6 天前
OpenClaw 不错,但我好像没有那么需要 -- 肘子的 Swift 周报 #125
人工智能·swiftui·swift
Swift社区11 天前
LeetCode 391 完美矩形 - Swift 题解
算法·leetcode·swift
升讯威在线客服系统12 天前
从 GC 抖动到稳定低延迟:在升讯威客服系统中实践 Span 与 Memory 的高性能优化
java·javascript·python·算法·性能优化·php·swift
Swift社区12 天前
LeetCode 390 消除游戏 - Swift 题解
leetcode·游戏·swift
东坡肘子13 天前
春晚、机器人、AI 与 LLM -- 肘子的 Swift 周报 #124
人工智能·swiftui·swift
君赏14 天前
第三十二章 接下来我们开始做`灭菌整板`页面
swiftui
君赏14 天前
第三十章 接下来我们写首页的功能,首先是我们的`托盘绑定箱号`。
swiftui
君赏14 天前
第三十一章 完善箱号列表
swiftui