如何修复适用于 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 Text.minimumScaleFactor(…)无法正确缩放文本?