0
の配列はCAEmitterCell
です。私はすべての細胞の各出力が混ざり合って欲しいです。現在、配列の最初のセルは常に他のセルの上に描画されます。CAEmitterLayer複数のセルがインターリーブされています
レイヤのrenderMode
と各セルのzAcceleration
を調整しましたが、どちらもこの問題を解決していません。
いくつかのサンプルコード:
func layoutSubviews() {
// ...
emitterLayer.frame = self.bounds
emitterLayer.seed = UInt32(Date().timeIntervalSinceNow)
emitterLayer.renderMode = kCAEmitterLayerOldestFirst
emitterLayer.emitterPosition = CGPoint(x: bounds.midX, y: bounds.midY)
emitterLayer.emitterSize = CGSize.init(width: bounds.width, height: 0)
emitterLayer.emitterShape = kCAEmitterLayerLine
self.layer.addSublayer(emitterLayer)
}
private func animate() {
// ...
if emitterLayer.emitterCells == nil || emitterLayer.emitterCells?.count == 0 {
let cells = (1...8).map { i -> CAEmitterCell in
if let img = UIImage.init(named: "Slice-\(i)") {
return createEmitterCell(image: img, index: i)
} else {
fatalError()
}
}
emitterLayer.emitterCells = cells
}
}
private func createEmitterCell(image: UIImage, index: Int) -> CAEmitterCell {
let cell = CAEmitterCell.init()
cell.isEnabled = true
cell.contents = image.cgImage
cell.contentsRect = CGRect(origin: CGPoint.zero, size: CGSize(width: 1, height: 1))
cell.birthRate = Float(index)
cell.lifetime = 3
cell.velocity = 7
cell.velocityRange = 3
cell.scale = 0.5
cell.emissionRange = (95 * CGFloat.pi/180.0)
cell.emissionLatitude = (27 * CGFloat.pi/180.0)
cell.emissionLongitude = (139 * CGFloat.pi/180.0)
cell.xAcceleration = 10.0
cell.yAcceleration = 100.0
cell.zAcceleration = 10 * CGFloat(index)
return cell
}
アレイに配置された重複エミッタがこの効果を生み出すことがあります。例: '[cell1、cell2、cell1]' – JoePasq