EmitterCells 未显示在 CAEmitterLayer 中

EmitterCells not showing in CAEmitterLayer

我似乎无法让 CAEmitterLayer 显示 CAEmitterCells。我在 Storyboard 中添加了 ConfettiEmitterView,该视图按预期显示为红色背景。但是细胞没有显示出来。也没有错误或警告。

代码:

import UIKit

class ConfettiEmitterView: UIView {

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.emissionLongitude = .pi
    cell.emissionRange = .pi / 8
    cell.scale = scale
    cell.scaleRange = scale / 3
    cell.contents = roundImage(with: .yellow)
    return cell
}

override func layoutSubviews() {
    let emitter = self.layer as! CAEmitterLayer
    emitter.frame = self.bounds
    emitter.masksToBounds = true
    emitter.emitterShape = .line
    emitter.emitterPosition = CGPoint(x: bounds.midX, y: 0)
    emitter.emitterSize = CGSize(width: bounds.size.width, height: 1)
    
    emitter.backgroundColor = UIColor.red.cgColor // Setting the background to red
    
    let near = makeEmmiterCell(color: UIColor(white: 1, alpha: 1), velocity: 100, scale: 0.3)
    let middle = makeEmmiterCell(color: UIColor(white: 1, alpha: 0.66), velocity: 80, scale: 0.2)
    let far = makeEmmiterCell(color: UIColor(white: 1, alpha: 0.33), velocity: 60, scale: 0.1)
    
    emitter.emitterCells = [near, middle, far]
}

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()
        }
    }

}

将 ConfettiEmitterView 类型的视图添加到情节提要中的 UIViewController 应该足以重现问题。

改变

cell.contents = roundImage(with: .yellow)

cell.contents = roundImage(with: .yellow).cgImage