CAEmitterLayer的发射经度和纬度迅速

问题描述

您好,我有一个关于发射经度和纬度的问题,我不知道它们的用途是什么。 我目前正在学习一本有关动画的教程,并且现在就在CAEmitterLayer上,由于我对这两件事一无所知,所以我已停止学习。 多谢您的协助。 谢谢。

解决方法

通常,最好的学习方法是尝试。我建议您点击该文章末尾的源代码链接(here),下载该项目,然后使用该代码。

根据该文章,这是一个快速,简单的示例:

class EmmitterTestViewController: UIViewController {

    let eView = BasicParticleView()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // create a 12x12 round red image
        let img = roundImage(with: .red)
        eView.particleImage = img
        
        eView.translatesAutoresizingMaskIntoConstraints = false
        eView.backgroundColor = .cyan
        
        view.addSubview(eView)
        let g = view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            eView.topAnchor.constraint(equalTo: g.topAnchor,constant: 20.0),eView.leadingAnchor.constraint(equalTo: g.leadingAnchor,eView.trailingAnchor.constraint(equalTo: g.trailingAnchor,constant: -20.0),eView.bottomAnchor.constraint(equalTo: g.bottomAnchor,])
    }
    
    func roundImage(with color: UIColor) -> UIImage {
        let rect = CGRect(origin: .zero,size: CGSize(width: 12.0,height: 12.0))
        return UIGraphicsImageRenderer(size: rect.size).image { context in
            context.cgContext.setFillColor(color.cgColor)
            context.cgContext.addPath(UIBezierPath(ovalIn: rect).cgPath)
            context.cgContext.fillPath()
        }
    }

}

class BasicParticleView:UIView {
    
    var particleImage:UIImage?
    
    override class var layerClass:AnyClass {
        return CAEmitterLayer.self
    }
    
    func makeEmmiterCell(color:UIColor,velocity:CGFloat,scale:CGFloat)-> CAEmitterCell {
        let cell = CAEmitterCell()
        cell.birthRate = 10
        cell.lifetime = 20.0
        cell.lifetimeRange = 0
        cell.velocity = velocity
        cell.velocityRange = velocity / 4
        
        cell.emissionRange = .pi / 8
        cell.scale = scale
        cell.scaleRange = scale / 3
        
        cell.contents = particleImage?.cgImage

        // emissionLongitude - direction of particles on x/y plane
        //  .pi * 0.0 == up
        //  .pi * 1.0 == down
        //  .pi * 0.5 == left-to-right
        //  .pi * 1.5 == right-to-left
        //  .pi * 0.25 == angle-up-right
        cell.emissionLongitude = .pi * 0.0
        
        return cell
    }
    
    override func layoutSubviews() {
        let emitter = self.layer as! CAEmitterLayer
        emitter.masksToBounds = true
        emitter.emitterShape = .line
        
        emitter.emitterPosition = CGPoint(x: bounds.midX,y: bounds.midY)
        emitter.emitterSize = CGSize(width: 1,height: 1)

        let cell = makeEmmiterCell(color: UIColor(white: 1,alpha: 1),velocity: 100,scale: 0.3)
        emitter.emitterCells = [cell]
    }
    
}

这将创建青色视图(每侧插入20点以使其易于看到),并将生成圆形的红色粒子。在注释中请注意如何使用.emissionLongitude来更改方向。

.emissionLongitude = 0的样子-粒子“向上”移动:

enter image description here

.emissionLongitude = .pi的样子-粒子“向下”移动:

enter image description here

并且使用.emissionLongitude = .pi * 0.25-粒子“向右移动”:

enter image description here

使用设置...阅读文档...阅读文章/教程...检查示例代码...边走边学:)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...