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

相关推荐
末代iOS程序员华仔11 小时前
iOS 5.6 条例解决方法
flutter·ios·swift
末代iOS程序员华仔17 小时前
Guideline 5.6 - Developer Code of Conduct
flutter·ios·swift
sakiko_2 天前
OC基础语法(与Swift对比)-1
开发语言·ios·objective-c·swift
2501_916008893 天前
Flutter 开发 iOS,项目打包成 IPA,命令与免 Xcode两种方法
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
东坡肘子4 天前
举手之劳 -- 肘子的 Swift 周报 #151
人工智能·swiftui·swift
sakiko_4 天前
Swift学习笔记42-SwiftUI的属性包装器(讲解+面试)
笔记·学习·ios·swiftui·swift
weixin_531670897 天前
Interlude起来:动作动画和文字通知哪个更适合休息提醒?Mac上有没有用桌宠做动作引导的软件?
人工智能·macos·mac·swift
Daniel_Coder7 天前
我用 SwiftUI + GRDB 做了一个「按时吃药·服药提醒」App
ios·swiftui·swift·widgetkit
末代iOS程序员华仔8 天前
iOS个人开发者账号申请为啥会被卡住
ios·swift·figma
denggun123458 天前
信号量(DispatchSemaphore vs AsyncSemaphore)、swift协作式线程池 and python信号量
开发语言·python·swift