首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CAEmitterLayer多小区交织

CAEmitterLayer多小区交织
EN

Stack Overflow用户
提问于 2017-08-09 15:15:46
回答 1查看 347关注 0票数 0

我有一个CAEmitterLayer和一个CAEmitterCell数组,我希望每个单元格的输出都混合在一起。现在,数组中的第一个单元格总是绘制在其他单元格之上。

我已经调整了层的renderMode和每个单元格的zAcceleration,但都没有解决这个问题。

一些示例代码:

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-23 19:21:10

我有12个发射器单元,我的解决方案是随机化发射器的顺序。这样,应用程序的每次运行都会产生不同的排序。

代码语言:javascript
复制
        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的出生率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45594592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档