【问题标题】:SwiftUI - VStack make child Text span full widthSwiftUI - VStack 使子文本跨全宽
【发布时间】:2019-11-22 17:09:28
【问题描述】:

我正在尝试构建一个在 VStack 中包含 Text 的视图。我希望VStack 填满屏幕的整个宽度,我希望其中的Text 也能做到这一点。据我所知,代码如下:

import SwiftUI

struct Test: View {
    @State private var text = "Hello, World!"

    var body: some View {
        VStack {
            Text(text)
                .frame(maxWidth: .infinity)
                .animation(.default)
            Button(action: {
                self.text = (self.text == "Text") ? "Hello, World!" : "Text"
            }) {
                Text("Toggle")
            }
        }
        .frame(maxWidth: .infinity)
    }
}

struct Test_Previews: PreviewProvider {
    static var previews: some View {
        Test()
    }
}

当我检查预览并将鼠标悬停在文本和堆栈上时,它完全显示了我的预期,Text 是全宽的。但是,当我运行应用程序并调试视图层次结构时,它显示 Text 框架已调整大小以适合文本。虽然通常我不会介意这一点,但当文本更改为更长的副本时,它会导致动画显示椭圆。是否可以阻止 Text 调整大小以适应副本?

【问题讨论】:

  • 动画代码是什么?
  • 我刚刚更新了代码以显示动画正在做什么的示例。
  • 对了,既然文字是不可动画的,你也不需要换帧动画,那你为什么用animation()呢?

标签: text swiftui vstack


【解决方案1】:

你可以试试其他动画,比如spring:

            Text(text)
            .frame(maxWidth: .infinity)
            .animation(.spring(response: 0.0, dampingFraction:0.2))

【讨论】:

    【解决方案2】:

    看起来很难/不可能修复错误。

    您现在可以使用此解决方法,直到苹果允许我们更多地访问视图的框架和边界

    使用禁用的TextField 而不是Text

    TextField("", text: .constant(text))
        .multilineTextAlignment(.center)
        .disabled(true)
        .frame(maxWidth: .infinity)
    

    请注意,这是您所描述的全宽尺寸,但如您所知,字符串 不是 可动画的,因此您将看到 no如果帧也没有变化,则动画。


    使用单独的对象并在它们之间淡入淡出:

    ? 奖励:平滑渐变动画。

    struct ContentView: View {
        
        @State private var primaryText = "Hello, World!"
        @State private var alternativeText = "Text"
        @State private var isAlternative = false
    
        var body: some View {
            VStack {
                ZStack {
                    Text(primaryText).opacity(isAlternative ? 0:1)
                    Text(alternativeText).opacity(isAlternative ? 1:0)
                }.animation(.default)
                Button("Toggle") {
                    self.isAlternative.toggle()
                }
            }
        }
    }
    

    【讨论】:

    • 有趣的方法,虽然这似乎解决了我放在它上面的示例,但它不能很好地扩展。例如,如果我要构建一个计算器应用程序并希望在每次按下 = 时更新文本,我们需要任意数量的标签。似乎 SwiftUI 的限制还不能解决这个问题。
    • 嗯。如果您在原始问题中提到这种情况会更好。让我再想想。
    • @Steve 如果这对您有帮助,请不要忘记使用 upvote,如果它是所提供问题的答案,请不要忘记将其标记为答案。请随时就您关于扩展类似方法的其他问题提出一个新问题,我会在那里解决这个问题;)不要忘记在 cmets 中链接该问题。
    【解决方案3】:

    遇到了同样的问题。 最终得到了一个非常hacky的解决方案,但确实解决了它。请闭上眼睛。添加一些额外的空格可以解决调整大小的问题。 :)

    Text(on ? "Cooling" : "Off         ")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 2019-10-22
      • 2020-05-16
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      相关资源
      最近更新 更多