Приостановка и возобновление 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
подскочить немного вперед во времени.
Кто-нибудь может помочь мне решить эту проблему, пожалуйста?
1 ответ
Решение
Мне нужно было настроить 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()