首页 > 解决方案 > 多次暂停和恢复 CAEmitterLayer

问题描述

我有一个CAEmitterLayer实例,我想暂停然后多次恢复。

CAEmitterLayer我已经找到了使用两个扩展函数来做到这一点的各种方法:

public func pause() {
    speed = 0.0 // Freeze existing cells.
    timeOffset = convertTime(CACurrentMediaTime(), from: self)
    lifetime = 0.0 // Stop creating new cells.
}

public func resume() {
    speed = 1.0
    beginTime = convertTime(CACurrentMediaTime(), from: self) - timeOffset
    timeOffset = 0.0
    lifetime = 1.0
}

第一次使用emitterLayer.pause()emitterLayer.resume()完美运行。

但是,从第二次开始,每当我使用emitterLayer.pause()时,emitterCells跳跃的时间都会稍微向前一点。

有人可以帮我解决这个跳跃问题吗?

标签: iosswiftcore-animationcaemitterlayer

解决方案


我需要调整方法timeOffset中的pause()。这是一个用于暂停和恢复CAEmitterLayer实例的工作扩展:

extension CAEmitterLayer {

    /**
     Pauses a CAEmitterLayer.
     */
    public func pause() {
        speed = 0.0 // Freeze the CAEmitterCells.
        timeOffset = convertTime(CACurrentMediaTime(), from: self) - beginTime
        lifetime = 0.0 // Produce no new CAEmitterCells.
    }

    /**
     Resumes a paused CAEmitterLayer.
     */
    public func resume() {
        speed = 1.0 // Unfreeze the CAEmitterCells.
        beginTime = convertTime(CACurrentMediaTime(), from: self) - timeOffset
        timeOffset = 0.0
        lifetime = 1.0 // Produce CAEmitterCells at previous rate.
    }

}

用于:

var emitterLayer = CAEmitterLayer()
/// Configure as required

emitterLayer.pause()
emitterLayer.resume()

推荐阅读