2017-08-09 37 views
0

我有一個CAEmitterLayerCAEmitterCell的數組。我希望每個細胞的輸出都混合在一起。現在數組中的第一個單元格總是繪製在其他單元格之上。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 
} 

+0

它發生在我身上,排列在陣列中的重複發射器可能會產生這種效果。例如:'[cell1,cell2,cell1]' – JoePasq

回答

0

我有12周發射器的細胞和我的解決方案是隨機發射器的順序。這樣,應用程序的每次運行都會產生不同的順序。

 emojiCells = "✨✅" 
      .characters 
      .sorted(by: { (a, b) -> Bool in 
       return arc4random() % 2 == 0 
      }).enumerated().map({ (offset: Int, element: Character) -> CAEmitterCell in 
       // create emitter cells for each emoji 
       let raster = rasterize(emoji: element) 
       return createEmitterCell(image: raster, index: offset) 
      }) 
     emitterLayer.emitterCells = emojiCells 

如果我有較少的發射極細胞,然後我將包括圍繞着彼此重複的發射器。如[cell1, cell2, cell1]。其他調整將有助於這種情況,例如提高cell2的出生率。