SwiftUI 均等分布,内容对齐

Posted

技术标签:

【中文标题】SwiftUI 均等分布,内容对齐【英文标题】:SwiftUI equal distribution with content alignment 【发布时间】:2021-02-10 10:14:37 【问题描述】:

我想要三个标签,每个标签都有一个字幕并平均分配。

第一个标题/副标题应前导对齐(见下面的绿色边框) 中心标题/副标题应居中(见下方蓝色边框) 最后一个标题/副标题应尾随对齐。 (见下方红色边框) 只要宽度相等,它们都应该尽可能宽

这是我需要的草图:

这是我可以使用的 SwiftUI 视图

问题是我无法根据需要对齐标题。

这是我当前无法工作的代码

import SwiftUI

struct MyView: View 
    public var body: some View 
        HStack(spacing: 0) 
            cellView(top: "Leading",
                     bottom: "subtitle",
                     alignment: .leading)
                .border(Color.green)



            cellView(top: "Centered",
                     bottom: "subtitle",
                     alignment: .center)
                .border(Color.blue)



            cellView(top: "Trailing",
                     bottom: "subtitle",
                     alignment: .trailing)
                .border(Color.red)
        
            .padding()
    

    private func cellView(top: String, bottom: String, alignment: HorizontalAlignment) -> some View 
        VStack(alignment: alignment, spacing: 0) 
            Text(top)
                .frame(maxWidth: .infinity)
                .font(.subheadline)
                .lineLimit(1)
                .border(Color.black)

            Text(bottom)
                .font(.subheadline)
                .lineLimit(1)
                .border(Color.black)
        

        .border(Color.black)
    


struct MyView_Previews: PreviewProvider 
    static var previews: some View 
        MyView()
    

【问题讨论】:

【参考方案1】:

您可以让它们都喜欢扩展,然后直接对齐其框架的内容,而不是尝试对齐堆栈的子视图(请注意,由于对齐选项在 HorizontalAlignmentAlignment 之间匹配,您无需更改在你的body):

private func cellView(top: String, bottom: String, alignment: Alignment) -> some View 
    VStack(spacing: 0) 
        Text(top)
            .frame(maxWidth: .infinity, alignment: alignment)
            .font(.subheadline)
            .lineLimit(1)
            .border(Color.black)

        Text(bottom)
            .frame(maxWidth: .infinity, alignment: alignment)
            .font(.subheadline)
            .lineLimit(1)
            .border(Color.black)
    
    .border(Color.black)

产生期望的结果


PS:您甚至可以通过对常用修饰符进行分组来简化 cellView

private func cellView(top: String, bottom: String, alignment: Alignment) -> some View 
    VStack(spacing: 0) 
        Group 
            Text(top)
                .font(.subheadline)
            Text(bottom)
                .font(.subheadline)
        
        .frame(maxWidth: .infinity, alignment: alignment)
        .lineLimit(1)
        .border(Color.black)
    
    .border(Color.black)

【讨论】:

以上是关于SwiftUI 均等分布,内容对齐的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:将视图与 VStack 中另一个视图的前缘和后缘对齐

SwiftUI 简明教程之自定义对齐方式

如何将项目 HStack 与 VStack SwiftUI 对齐

SwiftUI:对齐文本

在添加和删除第二个按钮时保持 SwiftUI 中的导航项按钮对齐

ScrollView 文本对齐 SwiftUI