2017-05-09 88 views
4
var emitter = CAEmitterLayer() 
    emitter.emitterPosition = CGPoint(x: self.view.frame.size.width/2, y: -10) 
    emitter.emitterShape = kCAEmitterLayerLine 
    emitter.emitterSize = CGSize(width: self.view.frame.size.width, height: 2.0) 
    emitter.emitterCells = generateEmitterCells() 
    self.view.layer.addSublayer(emitter) 

這裏,CAEmitterLayer覆蓋我的看法...... self.view不可見的內容..如何將CAEmitterLayer背景設置爲透明?

參考。代碼:https://oktapodi.github.io/2017/05/08/particle-effects-in-swift-using-caemitterlayer.html

我想在我的視圖上設置此動畫。

+0

該代碼適用於我 - 動畫顯示在self.view的其他圖層和子視圖上。你正在做一些隱藏或隱藏self.view內容的東西。我會建議你發佈該代碼。 –

+0

喬恩羅斯是正確的,它工作正常。毫無疑問。 –

+0

我沒有更改示例代碼中的單行...我只是在self.view中添加了圖像視圖...你會plz只是添加圖像或東西在self.view和檢查 –

回答

0

它工作正常檢查我的模擬器輸出。背景圖片是從故事板添加的,藍色是通過代碼完成的。仍然正常工作。

OUTPUT: enter image description here

0

你可以通過改變你加層的方式,現在你將它添加上的一切,有時會隱藏其他圖層和視圖對象的頂部解決您的問題。

變化

self.view.layer.addSublayer(emitter) 

self.view.layer.insertSublayer(emitter, at: 0) 
0

我不知道如果我理解你正確的,但如果這是你正在尋找的效果:

enter image description here

然後您需要:

  1. 添加一個「容器視圖」爲您的發射住在
  2. 該視圖
  3. 設置clipsToBounds真爲你的容器視圖

這裏創建一個出口是我ViewController其產生的以上屏幕截圖

import UIKit 


enum Colors { 
    static let red = UIColor(red: 1.0, green: 0.0, blue: 77.0/255.0, alpha: 1.0) 
    static let blue = UIColor.blue 
    static let green = UIColor(red: 35.0/255.0 , green: 233/255, blue: 173/255.0, alpha: 1.0) 
    static let yellow = UIColor(red: 1, green: 209/255, blue: 77.0/255.0, alpha: 1.0) 
} 

enum Images { 
    static let box = UIImage(named: "Box")! 
    static let triangle = UIImage(named: "Triangle")! 
    static let circle = UIImage(named: "Circle")! 
    static let swirl = UIImage(named: "Spiral")! 
} 

class ViewController: UIViewController { 
    @IBOutlet weak var emitterContainer: UIView! 

    var emitter = CAEmitterLayer() 

    var colors:[UIColor] = [ 
     Colors.red, 
     Colors.blue, 
     Colors.green, 
     Colors.yellow 
    ] 

    var images:[UIImage] = [ 
     Images.box, 
     Images.triangle, 
     Images.circle, 
     Images.swirl 
    ] 

    var velocities:[Int] = [ 
     100, 
     90, 
     150, 
     200 
    ] 


    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     view.backgroundColor = UIColor.red 

     emitter.emitterPosition = CGPoint(x: emitterContainer.frame.size.width/2, y: -10) 
     emitter.emitterShape = kCAEmitterLayerLine 
     emitter.emitterSize = CGSize(width: emitterContainer.frame.size.width, height: 2.0) 
     emitter.emitterCells = generateEmitterCells() 
     emitterContainer.layer.addSublayer(emitter) 
     emitterContainer.clipsToBounds = true 
    } 

    private func generateEmitterCells() -> [CAEmitterCell] { 
     var cells:[CAEmitterCell] = [CAEmitterCell]() 
     for index in 0..<16 { 
      let cell = CAEmitterCell() 

      cell.birthRate = 4.0 
      cell.lifetime = 14.0 
      cell.lifetimeRange = 0 
      cell.velocity = CGFloat(getRandomVelocity()) 
      cell.velocityRange = 0 
      cell.emissionLongitude = CGFloat(Double.pi) 
      cell.emissionRange = 0.5 
      cell.spin = 3.5 
      cell.spinRange = 0 
      cell.color = getNextColor(i: index) 
      cell.contents = getNextImage(i: index) 
      cell.scaleRange = 0.25 
      cell.scale = 0.1 

      cells.append(cell) 
     } 

     return cells 
    } 

    private func getRandomVelocity() -> Int { 
     return velocities[getRandomNumber()] 
    } 

    private func getRandomNumber() -> Int { 
     return Int(arc4random_uniform(4)) 
    } 

    private func getNextColor(i:Int) -> CGColor { 
     if i <= 4 { 
      return colors[0].cgColor 
     } else if i <= 8 { 
      return colors[1].cgColor 
     } else if i <= 12 { 
      return colors[2].cgColor 
     } else { 
      return colors[3].cgColor 
     } 
    } 

    private func getNextImage(i:Int) -> CGImage { 
     return images[i % 4].cgImage! 
    } 
} 

希望能幫到你。