SwiftUI在VStack中的不同对齐文本

西蒙妮·皮斯奇基亚

我有一个聊天示例,其中包含3个文本,名称,文本和小时。我想将前两个文本向左对齐,将另一个文本向右对齐。

var body: some View {
            HStack {
                if self.cloudPosition == .dx {Spacer(minLength: 20)}
                VStack (alignment: .leading) {
                    Text("\(self.text.name)")
                        .font(.system(size: 15))
                        .foregroundColor(Self.getColor(index: self.text.colorIndex))
                        .padding(EdgeInsets(top: 3, leading: 15, bottom: 3, trailing: 10))
                    Text("\(self.text.text)")
                        .font(.system(size: 15))
                        .padding(EdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 8))
                    HStack {
                        Spacer() //I remove this in example 3 
                        Text("\(self.text.date, formatter: Self.timeFormat) ")
                            .font(.system(size: 9))
                            .foregroundColor(.gray)
                            .padding(3)
                    }
                }
                .background(self.cloudColor)
                .cornerRadius(10)
                .padding(10)
                if self.cloudPosition == .sx {Spacer(minLength: 20)}
            }
    }

枚举:

enum CloudPosition {
    case dx,sx
}

如果文本是log,就可以了示例1:

在此处输入图片说明

但如果很短,则示例2:

在此处输入图片说明

如果我删除了Spacer()示例3,那么聊天就可以了,但是不是正确的时间:

在此处输入图片说明

任何想法?谢谢

用户3441734

可能性之一...与游乐场检查

不需要太多解释,“技巧”是通过不同堆栈的正确组合,对齐.fixedSize(horizontal:, vertical:)Color.clear.frame(height:0)替换来完成的Spacer()所有这些都使基于消息文本的“自动”消息视图扩展成为可能。

import SwiftUI
import PlaygroundSupport

struct ContentView: View {

    var body: some View {

        VStack {

            HStack {
                Spacer()
                HStack {
                    VStack (alignment: .leading) {
                        Text("Lorem ipsum")
                            .font(.title)
                            .fixedSize()

                        Text("""
                        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
                        """)
                            .font(.system(size: 15))
                            .fixedSize(horizontal: false, vertical: true)

                        HStack {
                            Color.clear.frame(height: 0)
                            Text("22:13").fixedSize()
                        }
                    }
                    .padding()
                    .background(Color.yellow)
                    .cornerRadius(10)
                    .padding()

                }
                .scaledToFit()
            }
            .border(Color.red)

            HStack {
                Spacer()
                HStack {
                    VStack (alignment: .leading) {
                        Text("Lorem ipsum")
                            .font(.title)
                            .fixedSize()

                        Text("?")
                            .font(.system(size: 15))
                            .fixedSize(horizontal: false, vertical: true)

                        HStack {
                            Color.clear.frame(height: 0)
                            Text("22:13").fixedSize()
                        }
                    }
                    .padding()
                    .background(Color.yellow)
                    .cornerRadius(10)
                    .padding()

                }
                .scaledToFit()
            }
            .border(Color.red)

            HStack {
                Spacer()
                HStack {
                    VStack (alignment: .leading) {
                        Text("?")
                            .font(.title)
                            .fixedSize()

                        Text("Lorem ipsum")
                            .font(.system(size: 15))
                            .fixedSize(horizontal: false, vertical: true)

                        HStack {
                            Color.clear.frame(height: 0)
                            Text("22:13").fixedSize()
                        }
                    }
                    .padding()
                    .background(Color.yellow)
                    .cornerRadius(10)
                    .padding()

                }
                .scaledToFit()
            }
            .border(Color.red)

            Spacer()
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())

结果:

在此处输入图片说明

重复相同的代码3次,因为我很懒:-)

最后,您可以使用类似

struct Message<Header: View, Footer: View>: View {
    let header: Header
    let footer: Footer
    let message: String
    let color: Color

    var body: some View {
        HStack {
            Spacer()
            HStack {
                VStack (alignment: .leading) {
                    header.fixedSize()

                    Text(message)
                        .fixedSize(horizontal: false, vertical: true)

                    HStack {
                        color.frame(height: 0)
                        footer.fixedSize()
                    }
                }
                .padding()
                .background(color)
                .cornerRadius(10)
                .padding()

            }
            .scaledToFit()
        }
    }
}

使用@ViewBulder作为页眉和页脚

struct MessageBuilder<Header, Footer>: View where Header: View, Footer: View {

    let header: () -> Header
    let footer: () -> Footer
    let message: String
    let color: Color

    init(@ViewBuilder header: @escaping () -> Header, @ViewBuilder footer: @escaping () -> Footer, message: String, color: Color) {
        self.header = header
        self.footer = footer
        self.message = message
        self.color = color
    }

    var body: some View {
        HStack {
            Spacer()
            HStack {
                VStack (alignment: .leading) {
                    header().fixedSize()

                    Text(message)
                        .fixedSize(horizontal: false, vertical: true)

                    HStack {
                        color.frame(height: 0)
                        footer().fixedSize()
                    }
                }
                .padding()
                .background(color)
                .cornerRadius(10)
                .padding()

            }
            .scaledToFit()
        }
    }

}

然后在您的代码中使用它

struct ContentView: View {

    var body: some View {

        VStack {

            Message(header: Text("Header").font(.title), footer: Text("22:13"), message: "long or short message text", color: Color.blue.opacity(0.2))

            MessageBuilder(header: {
                HStack {
                    Image(systemName: "square.and.arrow.down")
                    Text("Fred")
                }
            }, footer: {
                Image(systemName: "clock")
            }, message: "message text", color: Color.gray.opacity(0.2))

            Spacer()
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SwiftUI VStack对齐错误?

来自分类Dev

如何在SwiftUI中将项目对齐到VStack中的顶部?

来自分类Dev

SwiftUI在多个HStack中对齐具有不同长度的文本

来自分类Dev

SwiftUI VStack右对齐单个元素

来自分类Dev

在内存中如何排列具有不同对齐方式的嵌套结构?

来自分类Dev

使VStack中的文本占据VStack的整个宽度

来自分类Dev

文本对齐/ swiftUi

来自分类Dev

ScrollView文本对齐SwiftUI

来自分类Dev

基于SwiftUI中的旋转在ZStack中对齐文本

来自分类Dev

在SwiftUI,SwiftUI中调整多个vstack宽度

来自分类Dev

VStack中的按钮和文本

来自分类Dev

如何在标签的右边对齐进度指示器并使标签在SwiftUI中的VStack中居中?

来自分类Dev

顶部菜单和子菜单的不同对齐方式

来自分类Dev

QGridLayout中小部件的不同对齐方式

来自分类Dev

QGridLayout中小部件的不同对齐方式

来自分类Dev

在不同对齐的指针UB之间是memcpy吗?

来自分类Dev

SwiftUI在不同的视图容器中对齐两个元素

来自分类Dev

在SwiftUI 2.0 iOS 14中更改DatePicker的文本对齐方式

来自分类Dev

为什么我的SwiftUI VStack无法正确对齐?

来自分类Dev

如何将项目HStack与VStack SwiftUI对齐

来自分类Dev

将文本与填充SwiftUI对齐

来自分类Dev

SwiftUI按钮文本对齐问题

来自分类Dev

在Django中获取最新的不同对象

来自分类Dev

访问.innerHTML中的不同对象

来自分类Dev

Xcode中的不同对象库

来自分类Dev

如何比较powershell中的不同对象

来自分类Dev

单个 ListView 中的不同对象

来自分类Dev

Java中不同对象之间的关系

来自分类Dev

如何用定义的边距对齐不同行中的文本