SwiftUI 阻止 Divider 在 HStack 中垂直扩展

Rob*_*b N 10 swiftui hstack

我正在使用 SwiftUI 创建类似警报弹出窗口的东西,我使用 UIHostingController 从 UIKit 代码中呈现。视图如下所示:

VStack(spacing: 0) {
    // Some text ...   

    HStack(spacing:0) {
        Button(action: self.onCancel) { Text("Cancel") }
           .padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)

        // This divider is the problem
        Divider() // .fixedSize()

        Button(action: self.onDelete) {  Text("Delete") }
           .padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)
    }
}.frame(minHeight: 0)
Run Code Online (Sandbox Code Playgroud)

inExpandingRectangle是我在另一个 stackoverflow 问题中发现的。它将 HStack 每一侧的文本居中。

extension View {
    func inExpandingRectangle() -> some View {
        ZStack {
            Rectangle().fill(Color.clear)
            self
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来像这样。垃圾。

在此处输入图片说明

如果我把.fixedSize()放在分隔线上,它就会这样做。并不可怕,但分隔器看起来很愚蠢,并且不会扩展到按钮的大小。

在此处输入图片说明

Asp*_*eri 12

这是一个可能的简化替代的演示,没有那个人为的扩展。使用 Xcode 11.4 / iOS 13.4 测试。

演示

Divider() // or Rectangle().fill(Color.gray).frame(height: 1)
HStack {
    Button(action: {}) { Text("Cancel").fixedSize() }
        .padding().frame(maxWidth: .infinity)

    Divider() // or Rectangle().fill(Color.gray).frame(width: 1)

    Button(action: {}) {  Text("Delete").fixedSize() }
        .padding().frame(maxWidth: .infinity)

}.fixedSize(horizontal: false, vertical: true)
Run Code Online (Sandbox Code Playgroud)

注意:还值得考虑自定义分隔线,例如

Rectangle().fill(Color.gray).frame(width: 1) // or any other color
Run Code Online (Sandbox Code Playgroud)

可能会给出很多合适的视觉反馈,比如

演示2

  • 它有效,谢谢。我希望有一天我们能得到关于 SwiftUI 布局真正工作原理的详细解释。事实上,我只是随机尝试一些事情并*希望*它能起作用,这不是一种有趣的编写代码的方式。 (2认同)

sfu*_*ng3 6

fixedSize()修饰符放在HStack而不是Divider修复问题上。

    var body : some View {
        VStack(spacing: 0) {
            // Some text ...
            Text("gsfdsfkajflkasdjflkas,jdflaskjf")
            HStack(spacing:0) {
                Button(action: {print("hi")}) { Text("Cancel") }
                    .padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)

                // This divider is the problem
                Divider()


                Button(action: {print("hello")}) {  Text("Delete") }
                    .padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)
            }.fixedSize()        <------- Insert this
        }.frame(minHeight: 0)
    }
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明