如何让 CATransaction 无限重复? - 斯威夫特

Posted

技术标签:

【中文标题】如何让 CATransaction 无限重复? - 斯威夫特【英文标题】:How to let CATransaction repeat infinitely? - Swift 【发布时间】:2018-03-05 15:51:23 【问题描述】:

我有一个包含CATransaction.begin() 的动画函数 我希望这个动画可以无限重复或重复定义的次数。 我该如何做到这一点?

如果你需要看代码,这是动画功能:

 private func animate(views: [UIView], duration: TimeInterval, intervalDelay: TimeInterval) 

        CATransaction.begin()
        CATransaction.setCompletionBlock 
            print("COMPLETED ALL ANIMATIONS")
        

        var delay: TimeInterval = 0.0
        let interval = duration / TimeInterval(views.count)

        for view in views 
            let transform = view.transform

            UIView.animate(withDuration: interval, delay: delay, options: [.curveEaseIn], animations: 

                view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)

            , completion:  (finished) in

                UIView.animate(withDuration: interval, delay: 0.0, options: [.curveEaseIn], animations: 

                    view.transform = transform

                , completion:  (finished) in


                )
            )

            delay += (interval * 2.0) + intervalDelay
        
        CATransaction.commit()
    

【问题讨论】:

你到底想永远重复什么? 一般来说有选项.repeat,但我不确定它是否适合CATransaction的需要。 我认为那里的所有CATransaction 都是多余的, 【参考方案1】:

我认为CATransaction 那里多余

如果我理解你想要达到的目标

UIView.animate(withDuration: interval, delay: delay, options: [.curveEaseIn, .autoreverse, .repeat], animations:  
    self.views.forEach$0.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
, completion: nil)

编辑:循环脉冲的递归函数

func pulse(index: Int) 
    guard views.count > 0 else  return 
    let resolvedIndex = (views.count < index) ? index : 0
    let duration = 1.0
    let view = views[resolvedIndex]
    UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseIn,.autoreverse], animations: 
        self.view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
    )  [weak self] _ in
        self?.pulse(index: resolvedIndex + 1)
    

【讨论】:

我的程序创建了几个视图,将它们排列成一个圆形路径,然后每个视图以一种有序的方式“变换”动画,换句话说,一个一个。您的一段代码使所有视图同时动画化。我想做的是重复这个动画循环,因为现在它只发生一次。 你希望他们在第一轮后一起跳动。你想让他们在圈子里跳动吗? 我希望它们一个一个地跳动,而不是一起跳动,我希望这个循环不断重复。 .repeat 使单个视图连续重复脉冲,我不希望这样,因为正如我所提到的,我正在尝试重复整个循环。 一口气做不合理,用递归函数做会好很多

以上是关于如何让 CATransaction 无限重复? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

CATransaction:如何取消?

如何使内部正方形保持无限旋转[重复]

如何使用 CATransaction 为 CALayer 的出现设置动画?

为啥当我让这个函数返回它的值时,函数会无限重复自己?

防止重复无限滚动ajax加载器

CATransaction 完成块永远不会触发