Мы наблюдали очень странную проблему (изображения ниже).
- У нас есть представленный контроллер представления с
TeamBadgeView
, который представляет собой кнопку, которая выдает эмодзи какCAEmitterCells
. - Нажатие этой кнопки позволяет пользователям спамить смайликами огня на своем экране.
- Закрытие представленного контроллера представления и повторное представление контроллера представления, и теперь есть задержка. Чем больше раз я представляю/отключаю контроллер представления,
CAEmitterCell
становится все более и более невосприимчивым - Подтверждено, что это не проблема утечки, контроллер представления и кнопка освобождаются должным образом.
- Я пытался перемещать
CAEmitterLayer
иCAEmitterCell
, удерживая ссылку на кнопке и объявляя локально, но аналогичные проблемы - Возможно, самое странное, если я вообще не нажимаю кнопку, а просто много раз представляю/закрываю контроллер просмотра, а затем нажимаю кнопку, возникает задержка. Единственный раз, когда нет задержки, это нажатие кнопки при первом представлении контроллера представления.
- Я подтверждаю, что кнопка
action
срабатывает правильно, каждый раз, когда я спамлю кнопку. Просто ячейка эмиттера не рендерится несколько секунд. И некоторые ячейки-эмиттеры вообще не отображаются.
Дошло до ошеломляющей точки, есть ли у кого-нибудь какие-нибудь идеи или наводки на то, что это может быть?
Первая презентация ViewController:
После 5-го представления ViewController (нажатие кнопки с той же скоростью):
Код ViewController:
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]
}
}
emitterCells
вместо того, чтобы установить ее в[cell]
(и еслиemitterCells
равен нулю, тогда мне пришлось сначала инициализировать его пустым массивом). Так может быть, это причина того, что это идет медленно? - person Tyler   schedule 12.12.2019