我们已经看到了一个非常奇怪的问题(下面的 gif 图像),
- 我们有一个呈现的 View Controller,它有一个
TeamBadgeView
,它是一个按钮,它发出 emoji 作为CAEmitterCells
- 点击此按钮可让用户在他们的屏幕上发送垃圾邮件
- 关闭呈现的视图控制器,并重新呈现视图控制器,现在有一个延迟。我呈现/关闭视图控制器的
CAEmitterCell
次数越多,响应速度就越慢 - 确认这不是泄漏问题,视图控制器和按钮正在正确释放
- 我试过移动
CAEmitterLayer
和移动CAEmitterCell
,在按钮中保存一个引用,并在本地声明,但类似的问题 - 也许最奇怪的是,如果我根本不按下按钮,只是多次呈现/关闭视图控制器,然后按下按钮,就会有延迟。唯一没有延迟的情况是在第一次显示 View Controller 时按下按钮
- 每次我向按钮发送垃圾邮件时,我都确认按钮的
action
触发是正确的。只是发射器单元没有渲染几秒钟。并且一些发射器单元根本不渲染
它已经到了令人难以置信的地步,有人对这可能是什么有任何想法或线索吗?
在 ViewController 的第 5 次演示之后(以相同的速度按下按钮):
视图控制器代码:
let teamBadgeView = TeamBadgeView.fromNib()
teamBadgeView.configure()
按钮代码:
class TeamBadgeView: UIView {
let emitter = CAEmitterLayer()
let fireSize = CGSize(width: 16, height: 18)
let fireScale: CGFloat = 0.8
func configure() {
emitter.seed = UInt32(CACurrentMediaTime())
emitter.emitterPosition = CGPoint(x: bounds.midX, y: 0)
emitter.emitterShape = CAEmitterLayerEmitterShape.line
emitter.emitterSize = fireSize
emitter.renderMode = CAEmitterLayerRenderMode.additive
layer.addSublayer(emitter)
}
@IBAction func tapAction(_ sender: Any) {
emitFire()
}
private func emitFire() {
let cell = CAEmitterCell()
let beginTime = CACurrentMediaTime()
cell.birthRate = 1
cell.beginTime = beginTime
cell.duration = 1
cell.lifetime = 1
cell.velocity = 250
cell.velocityRange = 50
cell.yAcceleration = 100
cell.alphaSpeed = -1.5
cell.scale = fireScale
cell.emissionRange = .pi/8
cell.contents = NSAttributedString(string: "").toImage(size: fireSize)?.cgImage
emitter.emitterCells = [cell]
}
}