iOS (Swift) Изменение свойства CAEmitterCell после его инициализации - PullRequest
0 голосов
/ 06 декабря 2018

Моя цель - создать эффект огня, используя CAEmitterLayer, сила которого может быть изменена путем изменения значения свойства alphaSpeed его данного CAEmitterCells.Меньшее значение alphaSpeed приведет к «ревущему» пожару, в то время как большее значение подавит огонь.

Пока у меня есть подкласс CAEmitterLayer, называемый FireEmitterLayer с инициализаторомзадается:

convenience init(view: UIView) {
    self.init()
    emitterPosition = CGPoint(x: 0.5 * view.bounds.width, y: view.bounds.height)
    emitterSize = CGSize(width: view.bounds.width, height: 0.05 * view.bounds.height)
    renderMode = .additive
    emitterShape = .line
    emitterCells = fireEmitterCells
 }

Ячейки эмиттера генерируются для массива UIImage s, представляющего 30x30 изображений пламени:

private var fireEmitterCells: FireEmitterCells {
    var emitterCells = FireEmitterCells()
    for assetIdentifier in assetIdentifiers {
        let emitterCell = fireEmitterCell(for: assetIdentifier)
        emitterCells.append(emitterCell)
    }
    return emitterCells
}

Каждая ячейка создается с использованием этого метода:

private func fireEmitterCell(for assetIdentifier: UIImage.AssetIdentifier) -> CAEmitterCell {
    let fireEmitterCell = CAEmitterCell()
    fireEmitterCell.contents = UIImage(assetIdentifier: assetIdentifier).resized(to: CGSize(width: 20.0, height: 20.0)).cgImage
    fireEmitterCell.alphaSpeed = -0.3
    fireEmitterCell.birthRate = fireBirthRate
    fireEmitterCell.lifetime = fireLifetime
    fireEmitterCell.lifetimeRange = 0.5
    fireEmitterCell.color = UIColor.init(red: 0.8, green: 0.4, blue: 0.2, alpha: 0.6).cgColor
    fireEmitterCell.emissionLongitude = .pi
    fireEmitterCell.velocity = 80.0
    fireEmitterCell.velocityRange = 5.0
    fireEmitterCell.emissionRange = 0.5
    fireEmitterCell.yAcceleration = -200.0
    fireEmitterCell.scaleSpeed = 0.3
    return fireEmitterCell
}

Есть ли способ изменить значение alphaSpeed этих ячеек из экземпляра этого подкласса, называемого, скажем, fireEmitterLayer в пределах некоторого UIViewController:

var fireEmitterLayer = FireEmitterLayer(view: view)

IЯ пытался добавить этот метод в FireEmitterLayer класс

private func setAlphaSpeed(_ alphaSpeed: Float) {
    guard let emitterCells = emitterCells else { return }
    for emitterCell in emitterCells {
        emitterCell.alphaSpeed = alphaSpeed
    }
}

, но это не работает ...

Любая помощь приветствуется: -)

...