【发布时间】:2020-12-29 12:11:24
【问题描述】:
当文本对于其上下文而言太长时,我有一个视图可以使文本从左向右滑动。
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()
}
}
这里的问题是,如果我有一个太长的文本,它会做正确的动画,但是当我在动画过程中更改文本时,它没有考虑新的大小和@987654322 @ 被忽略。我还为我的@Binding var text: String 尝试了didSet,它也不起作用。
我不确定如何在这里处理这种情况,我尝试使用自定义 Binder 但没有奏效。我知道在 iOS 14 中会有一个 onUpdate(on: _) 函数,但我也需要它在 iOS 13 上工作。
您知道我可以做些什么来更新我的文本并能够更新isTextLargerThanView吗?
感谢您以后的帮助!
【问题讨论】: