如何修复适用于 SwiftUI 中文本的动画制作帧问题/错误?

Posted

技术标签:

【中文标题】如何修复适用于 SwiftUI 中文本的动画制作帧问题/错误?【英文标题】:How I can fix Animation made frame issue/bug applying to Text in SwiftUI? 【发布时间】:2020-11-23 15:44:01 【问题描述】:

我想在文本视图上使用弹簧动画,但动画改变了这个视图不必要的东西,这使得某些部分因为这个问题/错误而被剪掉。为了保守起见,我制作了一个带有背景颜色的精确文本视图,另一个没有!如您所见,弹簧动画应该只使用 View 的位置或偏移量,而不是框架的大小! 或者可能是因为在位置相同的情况下改变了偏移量。我坚信这是一个错误。我可以让我自己的自定义弹簧动画效果比这更好,但我想知道有什么办法可以解决这个问题吗?

PS:我发现 Text 上的各种动画都有这个问题!

    struct ContentView: View 
    
    @State var stringForText: String = String()
    
    var body: some View 
        
        
        Button("add")  stringForText += "?".padding()
            
        Text(stringForText).font(.largeTitle).bold().padding().animation(.spring(response: 1, dampingFraction: 0.01, blendDuration: 1))
            
        Text(stringForText).font(.largeTitle).bold().background(Color.yellow).padding().animation(.spring(response: 1, dampingFraction: 0.01, blendDuration: 1))
        
    

【问题讨论】:

你看到弹簧动画应该只使用 View 的位置或偏移量 - 这个假设是不正确的。隐式动画应用于所有动画属性。在考虑的情况下,位置和大小(即实际框架)并且它们按预期从较小的矩形到较大的矩形(带有弹簧)进行动画处理。内容,即内部文本,是不可动画的。从您的帖子中,您还不清楚您真正想要实现什么。 【参考方案1】:

SwiftUI 中的修饰符受顺序影响。因此,将 .animation 修饰符 after 所有其他修饰符意味着 SwiftUI 将尝试为 all(可动画的)修饰符设置动画,例如 .padding 修饰符(确实是可动画的)。

目前还不清楚预期的行为是什么,但是,通过应用上述解决方案,黄色背景大小保持不变,因为它的填充没有动画。

修复使用 .animation 时的填充变化:

【讨论】:

以上是关于如何修复适用于 SwiftUI 中文本的动画制作帧问题/错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何使我的自定义 ViewModifier 仅适用于 SwiftUI 中符合(可识别和视图)的内容/视图?

如何在 SwiftUI 中动画/过渡文本值更改

如何在 SwiftUI 中制作斜体圆形样式系统文本?

SwiftUI Text.minimumScaleFactor(…)无法正确缩放文本?

如何以正确的方式在 SwiftUI 中使用颜色? (特别适用于具有 Light 和 DarkMode 的应用程序)

如何根据 TextEditor 的文本更改为 SwiftUI 视图设置动画?