首页 > 解决方案 > 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被忽略。我也尝试了一个didSetfor my @Binding var text: String,它也不起作用。

我不确定如何在这里处理这种情况,我尝试使用自定义活页夹但没有奏效。我知道在 iOS 14 中会有一个onUpdate(on: _)功能,但我也需要它在 iOS 13 上工作。

您知道我可以做些什么来更新我的文本并能够更新isTextLargerThanView?

感谢您对未来的任何帮助!

标签: swiftswiftui

解决方案


我无法运行你的代码。也许你可以尝试让它像这样反应:

@Binding var text: String {
        didSet {
            isTextLargerThanView = (text.size(forWidth: geometryProxy.size.width, andFont: font).width > geometryProxy.size.width)
        }
    }
    
...

@State private var isTextLargerThanView = false

推荐阅读