我有一个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
都会在时间上稍微向前跳。
请问有人可以帮助我解决这个跳跃问题吗?
答案 0 :(得分:3)
我需要在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()