Swift UI 不一致的文本填充空格

Swift UI inconsistent text padding with spaces

这是到目前为止我的 Swift 项目的视觉效果。

我希望每个描述都有一致的填充。如您所见,即使我应用了一致的填充常量,也没有实现。我认为问题与每个文本块及其不同的间距有关。即第二个在“毛发”之后有一个 space 但在 space 之前结束,也许以某种方式将 space 添加到 .leading 填充。另请注意,图像的 .leading padding 会相应移动。

因为这些块中的文本最终将来自用户输入(不是我这里的随机文本),所以对文本和 spaces 的任意组合应用一致的填充是至关重要的。

这里出了什么问题?

当前代码:

struct Header: View {
    var name: String
    var connection: String
    var image: String
    
    init(name: String, connection: String, image: String) {
        self.name = name
        self.connection = connection
        self.image = image
    }
    
    var body: some View {
        HStack() {
            Image(self.image)
                .resizable()
                .frame(width: 60, height: 60)
                .clipShape(Circle())
            VStack(alignment: .leading) {
                Text(self.name)
                    .font(.headline)
                    .fontWeight(.semibold)
                    .foregroundColor(Color.black)
                    .frame(alignment: .leading)
                Text(self.connection)
                    .font(.callout)
                    .fontWeight(.medium)
                    .foregroundColor(Color.gray)
                    .frame(alignment: .leading)
            
            }
        }
    }
}


struct Description: View {
    var description: String
    
    init(description: String) {
        self.description = description
    }
    
    var body: some View {
        Text(self.description)
            .multilineTextAlignment(.leading)
    }
}


struct Post: View {
    var data: PostData
    
    init(data: PostData) {
        self.data = data
    }
    
    var body: some View {
        HStack(alignment: .top) {
            Spacer()
                .frame(width: 110)
            VStack(alignment: .leading, spacing: 0.0) {
                Header(name: self.data.name, connection: self.data.connection, image: self.data.image)
                    .padding(.top, 10)
                    .padding(.bottom, 6)
                    .padding(.leading, 6)
                Description(description: self.data.description)
                    .padding(.bottom, 6)
                    .padding(.leading, 7)
                    .padding(.trailing, 5)
                    
            }
            .frame(maxWidth: .infinity)
            .border(Color.black)
        }
    }
}



struct PostView: View {
    var body: some View {
        VStack(spacing: -1.0) {
            Spacer()
            Post(data: one)
            Post(data: two)
            Post(data: three)
        }
    }
}
      

马特(在评论中)是完全正确的。我只是对嵌套的 VStacks 感到困惑。这更容易修复并且非常有意义。对齐应该在 top 级别:

struct PostView: View {
    var body: some View {
        VStack(alignment: .leading, spacing: -1.0) { // <=== here
            Spacer()
            Post(data: one)
            Post(data: two)
            Post(data: three)
        }
    }
}

问题是您的对齐应用在 Post 级别,但每个 Post 然后根据其自身的宽度居中。错位的宽度post比其他的要小一点


旧答案:

修复它很简单。解释它对我来说仍然是个谜。 (固定:见下文)

此 post 的文本要求比其他 space 少一点,这导致它居中。我不清楚的是为什么 alignment: .leading 没有对齐它。

与大多数“推到边缘”问题一样,解决方法是一个 Spacer:

VStack(alignment: .leading, spacing: 0.0) {
    Header(name: self.data.name, connection: self.data.connection, image: self.data.image)
        .padding(.top, 10)
        .padding(.bottom, 6)
        .padding(.leading, 6)
    HStack {
        Description(description: self.data.description)
            .padding(.bottom, 6)
            .padding(.leading, 7)
            .padding(.trailing, 5)
        Spacer() // <== Left-justify
    }

这会将文本按您想要的方式向左推。但是我没有一个很好的答案来说明为什么需要它。

另一种可能更容易推理的方法是用显式间隔符替换填充:

HStack {
    Spacer().frame(width: 7)
    Description(description: self.data.description)
    Spacer(minLength: 5)
}
.padding(.bottom, 6)