1

我们已经看到了一个非常奇怪的问题(下面的 gif 图像),

  1. 我们有一个呈现的 View Controller,它有一个TeamBadgeView,它是一个按钮,它发出 emoji 作为CAEmitterCells
  2. 点击此按钮可让用户在他们的屏幕上发送垃圾邮件
  3. 关闭呈现的视图控制器,并重新呈现视图控制器,现在有一个延迟。我呈现/关闭视图控制器的CAEmitterCell次数越多,响应速度就越慢
  4. 确认这不是泄漏问题,视图控制器和按钮正在正确释放
  5. 我试过移动CAEmitterLayer和移动CAEmitterCell,在按钮中保存一个引用,并在本地声明,但类似的问题
  6. 也许最奇怪的是,如果我根本不按下按钮,只是多次呈现/关闭视图控制器,然后按下按钮,就会有延迟。唯一没有延迟的情况是在第一次显示 View Controller 时按下按钮
  7. 每次我向按钮发送垃圾邮件时,我都确认按钮的action触发是正确的。只是发射器单元没有渲染几秒钟。并且一些发射器单元根本不渲染

它已经到了令人难以置信的地步,有人对这可能是什么有任何想法或线索吗?

ViewController 的第一个介绍:
在此处输入图像描述

在 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]
    }
}
4

2 回答 2

1

emitterCells而不是每次都设置数组:

emitter.emitterCells = [cell]

...将新单元格附加到它。如果它为 nil,请确保将其初始化为空数组,否则附加将不起作用:

if emitter.emitterCells == nil {
    emitter.emitterCells = []
}

emitter.emitterCells?.append(cell)
于 2019-12-12T20:53:40.753 回答
0

感谢@TylerTheCompiler,我们能够弄清楚这一点,这真的很蹩脚。

一行更改,而不是设置emitterCells,我们需要追加

    emitter.emitterCells = [cell]

变成了

    emitter.emitterCells?.append(cell)

我们之所以没有注意到这一点,是因为它似乎与英雄转换有一种奇怪的互动。我们的 ViewController 是通过 Hero Transition 呈现的,出于某种原因,它在第一次呈现时emitterCells = [cell]按预期工作......但是由于某种原因,对于 ViewController 的每个后续 Hero Transition,cell 开始越来越慢,直到它回来到预期的缓慢状态。令人难以置信的奇怪,也许是英雄中的一个错误,但谁知道

于 2019-12-12T20:54:03.160 回答