8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

SwiftUI:停止永远重复的动画

BJonas88 1月前

38 0

我希望屏幕上有某种“徽章”,当条件满足时,它会反复从正常大小跳变到更大,然后回到正常大小,直到不再满足条件。我...

我希望屏幕上有一个“徽章”,当条件满足时,它会反复从正常大小弹跳到更大再回到正常大小,直到条件不再满足。但我似乎无法让徽章停止“弹跳”。 一旦开始,就无法停止。

我尝试过的方法: 我尝试过使用一些动画,但它们可以分为使用“repeatForever”来实现所需效果的动画和不使用“repeatForever”的动画。例如:

Animation.default.repeatForever(autoreverses: true)

Animation.spring(response: 1, dampingFraction: 0, blendDuration: 1) (将阻尼设置为 0 可使其永远持续下去)

然后用 .animation(nil) 替换它。似乎不起作用。有人有什么想法吗?提前非常感谢!以下是重现它的代码:

struct theProblem: View {
    @State var active: Bool = false

    var body: some View {
        Circle()
            .scaleEffect( active ? 1.08: 1)
            .animation( active ? Animation.default.repeatForever(autoreverses: true): nil )
            .frame(width: 100, height: 100)
            .onTapGesture {
                self.active = !self.active

        }
    }
}
帖子版权声明 1、本帖标题:SwiftUI:停止永远重复的动画
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由BJonas88在本站《ios》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我明白了!

    如果用 替换动画,则 .repeatForever() 使用 的动画 nil . 如果用相同的动画但不带 替换它,则使用 的动画将停止 .repeatForever() 。(或者,使用任何其他停止的动画,因此,您可以使用持续时间为 0 的线性动画来立即停止)

    换句话说,这是行不通的: .animation(active ? Animation.default.repeatForever() : nil)

    但这确实有效: .animation(active ? Animation.default.repeatForever() : Animation.default)

    为了使其更具可读性和易于使用,我将其放入扩展中,您可以像这样使用: .animation(Animation.default.repeat(while: active))

    这是一个使用我的扩展程序的交互式示例,您可以使用实时预览来测试它:

    import SwiftUI
    
    extension Animation {
        func `repeat`(while expression: Bool, autoreverses: Bool = true) -> Animation {
            if expression {
                return self.repeatForever(autoreverses: autoreverses)
            } else {
                return self
            }
        }
    }
    
    struct TheSolution: View {
        @State var active: Bool = false
        var body: some View {
            Circle()
                .scaleEffect( active ? 1.08: 1)
                .animation(Animation.default.repeat(while: active))
                .frame(width: 100, height: 100)
                .onTapGesture {
                    self.active.toggle()
                }
        }
    }
    
    struct TheSolution_Previews: PreviewProvider {
        static var previews: some View {
            TheSolution()
        }
    }
    

    据我所知,一旦您指定了动画,它就不会消失,直到您的视图完全停止。因此,如果您有一个设置为永远重复并自动反转的 .default 动画,然后您指定一个持续时间为 4 的线性动画,您会注意到默认的重复动画仍在继续,但它的移动速度越来越慢,直到它在 4 秒结束时完全停止。所以我们通过线性动画将默认动画停止。

返回
作者最近主题: