2

我正在尝试构建一个TextVStack. 我想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调整大小以适应副本?

4

3 回答 3

2

您可以尝试其他动画,例如spring

            Text(text)
            .frame(maxWidth: .infinity)
            .animation(.spring(response: 0.0, dampingFraction:0.2))
于 2019-11-26T06:25:08.487 回答
0

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

你现在可以使用这个解决方法,直到苹果让我们更多地访问视图的框架和边界

使用 disabledTextField代替Text

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

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


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

奖励:平滑的渐变动画。

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()
            }
        }
    }
}
于 2019-11-22T18:04:54.530 回答
-2

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

Text(on ? "Cooling" : "Off         ")
于 2020-02-13T14:01:31.413 回答