ios - 多次暂停和恢复 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
跳跃的时间都会稍微向前一点。
有人可以帮我解决这个跳跃问题吗?
解决方案
我需要调整方法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()
推荐阅读
- python - Redis-server缓存自动清除
- python - 在 Python 中运行 pdoc 时如何解决 ModuleNotFoundError?
- jquery - 如何在 Angular 的打字稿文件中使用 raty.js?
- python - 如何将 Scipy 的 `csr_matrix` 转换为 Tensorflow 的 `SparseTensor`?
- reactjs - 如何将从 API 获取的数据作为道具传递给其路由在 React JS 的另一个页面中定义的组件?
- google-sheets - 谷歌表键
- python - 如何在 python 中使用 dtypes 创建饼图
- swift - 在任何 iOS 设备的 Swift 包构建中:在范围内找不到类型“EdgeInsets”
- angular - Angular i18n - 路由到区域设置客户端 - 部署颠覆的 Angular index.html
- javascript - Javascipt copyFile 抛出错误并继续