我有一个视图,当文本对于上下文而言太长时,会使文本从左向右滑动。
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()
}
}
这里的问题是,如果我的文本太长,它将执行正确的动画处理,但是当我在动画处理期间更改文本时,它没有考虑新的大小和{{ 1}}被忽略。我还为自己的isTextLargerThanView
尝试了didSet
,但也没有用。
我不确定在这里如何处理这种情况,我尝试使用自定义绑定程序,但没有用。我知道在iOS 14中将有一个@Binding var text: String
函数,但我也需要它在iOS 13上运行。
您是否知道我该怎么做才能更新文本并能够更新onUpdate(on: _)
?
感谢您将来的帮助!
答案 0 :(得分:0)
我无法运行您的代码。也许您可以尝试使它像这样反应:
@Binding var text: String {
didSet {
isTextLargerThanView = (text.size(forWidth: geometryProxy.size.width, andFont: font).width > geometryProxy.size.width)
}
}
...
@State private var isTextLargerThanView = false