swift - SwiftUI - 重新加载/强制视图更新/停止动画
问题描述
我有一个观点,当文本对于其上下文而言太长时,文本会从左向右滑动。
import SwiftUI
struct SlidingText: View {
let geometryProxy: GeometryProxy
@Binding var text: String
let font: Font
@State private var animateSliding: Bool = false
private let slideDelay: Double = 3
private let slideDuration: Double = 6
private var isTextLargerThanView: Bool {
if text.size(forWidth: geometryProxy.size.width, andFont: font).width < geometryProxy.size.width {
return false
}
return true
}
var body: some View {
ZStack(alignment: .leading, content: {
VStack(content: {
Text(text)
.font(self.font)
.foregroundColor(.white)
})
.id("SlidingText-Animation")
.fixedSize()
.animation(isTextLargerThanView ? Animation.linear(duration: slideDuration).delay(slideDelay).repeatForever(autoreverses: true) : nil)
.frame(width: geometryProxy.size.width,
alignment: isTextLargerThanView ? (animateSliding ? .trailing : .leading) : .center)
.onAppear(perform: {
self.animateSliding.toggle()
})
})
.clipped()
}
}
这里的问题是,如果我有一个太长的文本,它会做正确的动画,但是当我在动画期间更改文本时,它不会考虑新的大小并且isTextLargerThanView
被忽略。我也尝试了一个didSet
for my @Binding var text: String
,它也不起作用。
我不确定如何在这里处理这种情况,我尝试使用自定义活页夹但没有奏效。我知道在 iOS 14 中会有一个onUpdate(on: _)
功能,但我也需要它在 iOS 13 上工作。
您知道我可以做些什么来更新我的文本并能够更新isTextLargerThanView
?
感谢您对未来的任何帮助!
解决方案
我无法运行你的代码。也许你可以尝试让它像这样反应:
@Binding var text: String {
didSet {
isTextLargerThanView = (text.size(forWidth: geometryProxy.size.width, andFont: font).width > geometryProxy.size.width)
}
}
...
@State private var isTextLargerThanView = false
推荐阅读
- google-sheets - 在 Google 表格中合并两张表格
- matlab - 尽管切片,为什么 parfor 很慢?
- python - 在 python 中读取、更改和写入配置文件后保留注释
- sql - 如何使用脚本 (SQL Server) 测试错误的表名和列名
- angular - 表格角度材料分页无法按预期工作
- c# - 为 RESTful 服务格式化 DateTime 的最佳方式是什么?
- angular - 角 6 材料
使用表单控件设置多个默认值 - ms-access - MSAccess - 预选组合框行
- python - 在 Windows 10 中使用 OpenCV 2.4.1 和 python 2.7.15 属性错误:'moduleobject 没有属性'createLBPHFaceRecognizer'
- c - 你怎么能在 C 语言中获得一个未格式化的可变长度字符串中的所有浮点数?