2017-07-17 104 views
0

我已经安装并定位CAEmitterLayer。它显示来自发射器的图像。sec sec后停止功能

该代码工作得很好,但我有一个问题。我想在5秒钟之后停止snowDribbbleBalls()函数。我很感激任何帮助导致我解决问题。

(而不是删除的子层,我想简单地停止功能)。

//real code 
class CompletedViewController: UIViewController { 

           self.snowDribbbleBalls() 
      DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) { [weak self] in 
       cell.birthRate = 0 
       cell2.birthRate = 0 
       cell3.birthRate = 0 
       cell4.birthRate = 0 

      } 


} 

func snowDribbbleBalls() { 

     let emitter = Emitter.get(with: #imageLiteral(resourceName: "ichi")) 
     emitter.emitterPosition = CGPoint(x: view.frame.width/2, y: 0) 
     emitter.emitterSize = CGSize(width: view.frame.width, height: 2) 
     self.view.layer.addSublayer(emitter) 

     let emitter2 = Emitter.get(with: #imageLiteral(resourceName: "ni")) 
     emitter2.emitterPosition = CGPoint(x: view.frame.width/6, y: 0) 
     emitter2.emitterSize = CGSize(width: view.frame.width, height: 2) 
     self.view.layer.addSublayer(emitter2) 

     let emitter3 = Emitter.get(with: #imageLiteral(resourceName: "san")) 
     emitter3.emitterPosition = CGPoint(x: view.frame.width/1, y: 0) 
     emitter3.emitterSize = CGSize(width: view.frame.width, height: 2) 
     self.view.layer.addSublayer(emitter3) 

     let emitter4 = Emitter.get(with: #imageLiteral(resourceName: "yon")) 
     emitter4.emitterPosition = CGPoint(x: view.frame.width/3.5, y: 0) 
     emitter4.emitterSize = CGSize(width: view.frame.width, height: 2) 
     self.view.layer.addSublayer(emitter3) 
    } 



class Emitter { 
    static func get(with image: UIImage) -> CAEmitterLayer { 
     let emitter = CAEmitterLayer() 
     emitter.emitterShape = kCAEmitterLayerLine 
     emitter.emitterCells = generateEmitterCells(with: image) 

     let emitter2 = CAEmitterLayer() 
     emitter2.emitterShape = kCAEmitterLayerLine 
     emitter2.emitterCells = generateEmitterCells(with: image) 

     let emitter3 = CAEmitterLayer() 
     emitter3.emitterShape = kCAEmitterLayerLine 
     emitter3.emitterCells = generateEmitterCells(with: image) 

     let emitter4 = CAEmitterLayer() 
     emitter4.emitterShape = kCAEmitterLayerLine 
     emitter4.emitterCells = generateEmitterCells(with: image) 

     return emitter 
    } 

    static func generateEmitterCells(with image: UIImage) -> [CAEmitterCell] { 
     var cells = [CAEmitterCell]() 

     let cell = CAEmitterCell() 
     cell.contents = image.cgImage 
     cell.birthRate = 30 
     cell.lifetime = 50 
     cell.velocity = CGFloat(300) 
     cell.emissionLongitude = (180 * (.pi/180)) 
     cell.emissionRange = (14 * (.pi/180)) 
     cell.scale = 0.25 
     cell.scaleRange = 0.3 
     //// 
     let cell2 = CAEmitterCell() 
     cell2.contents = image.cgImage 
     cell2.birthRate = 26 
     cell2.lifetime = 50 
     cell2.velocity = CGFloat(160) 
     cell2.emissionLongitude = (180 * (.pi/180)) 
     cell2.emissionRange = (12 * (.pi/180)) 
     cell2.scale = 0.25 
     cell2.scaleRange = 0.2 
     //// 
     let cell3 = CAEmitterCell() 
     cell3.contents = image.cgImage 
     cell3.birthRate = 20 
     cell3.lifetime = 50 
     cell3.velocity = CGFloat(160) 
     cell3.emissionLongitude = (180 * (.pi/180)) 
     cell3.emissionRange = (16 * (.pi/180)) 
     cell3.scale = 0.25 
     cell3.scaleRange = 0.2 
     //// 
     let cell4 = CAEmitterCell() 
     cell4.contents = image.cgImage 
     cell4.birthRate = 27 
     cell4.lifetime = 20 
     cell4.velocity = CGFloat(260) 
     cell4.emissionLongitude = (180 * (.pi/180)) 
     cell4.emissionRange = (10 * (.pi/180)) 
     cell4.scale = 0.25 
     cell4.scaleRange = 0.2 

     cells.append(cell) 

     return cells 

    } 

} 
+0

DispatchQueue.main.asyncAfter (截止日期:。现在()+ 1.0,执行:{ self.snowDribbbleBalls() }) 如果你想删除这个不是使用removefrom子视图 –

+0

'snowDribbbleBalls()'将只运行自动对焦几微秒,没有秒。事实上,你想停止一个动画? – clemens

+0

@ macmoonshine是的我想停止动画! – risa8

回答

2

只是为了把事情说清楚......函数不“跑”,而该层发光,所以真正的问题是“如何停止发射器?”,对此的答案是通过将发射器层的birthRate设置为零。

所以只是抱着一个引用(因为你不希望被删除),5秒后设置birthRate为零......

喜欢的东西:

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) { [weak self] in 
    // self.emitter is declared as 
    // var emitter: CAEmitterLayer! 
    // and set on `emitter = Emitter.get(with: #imageLiteral(resourceName: "ichi"))` 
    self?.emitter.birthRate = 0 
} 
+0

我试过你的代码,但它没有工作....:/ – risa8

+0

@ risa8你能请编辑您的问题并分享您的代码?因为我_did_在发帖之前尝试我的回答,并且工作正常... – Alladinian

+0

好吧给我一秒钟。错误是“CompleteViewController的值没有成员cell2”。 – risa8