SwiftUI-重新加载/强制视图以更新/停止动画

时间:2020-09-11 00:01:22

标签: 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()
    }
}

这里的问题是,如果我的文本太长,它将执行正确的动画处理,但是当我在动画处理期间更改文本时,它没有考虑新的大小和{{ 1}}被忽略。我还为自己的isTextLargerThanView尝试了didSet,但也没有用。

我不确定在这里如何处理这种情况,我尝试使用自定义绑定程序,但没有用。我知道在iOS 14中将有一个@Binding var text: String函数,但我也需要它在iOS 13上运行。

您是否知道我该怎么做才能更新文本并能够更新onUpdate(on: _)

感谢您将来的帮助!

1 个答案:

答案 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