【问题标题】:SwiftUI - Reload/Force the view to update/stop the animationSwiftUI - 重新加载/强制视图更新/停止动画
【发布时间】: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吗?

感谢您以后的帮助!

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

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

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

    【讨论】:

    • 我试过了,但没有调用 didSet。让我再尝试一次! (写在我原来的帖子里)
    • 你可以这样调用它来运行它,将字体替换为系统一:GeometryReader(content: { geometry in SlidingText(geometryProxy: geometry, text: self.$playerViewModel.seasonByline, font: .custom("FoundersGrotesk-RegularRegular", size: 15)) }) .frame(height: 20) .fixedSize(horizo​​ntal: false, vertical: true)
    • 哦,我没注意到你试过这个。我实际上确实用其他字体运行它,但屏幕是空白的。所以我可能会错过。
    猜你喜欢
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2019-10-26
    • 2018-08-31
    相关资源
    最近更新 更多