Приостановка и возобновление CAEmitterLayer несколько раз - PullRequest
0 голосов
/ 03 октября 2018

У меня есть экземпляр 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 Ответ

0 голосов
/ 03 октября 2018

Мне нужно было настроить 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()
...