我正在创建一个屏幕高度的CAEmitterLayer,并将-X推开,因此CAEmitterCells从左(离开屏幕)向右上移动。
在我遇到一个问题时,CAEmitterLayer的CAEmitterLayer高度属性被忽略了。这导致所有单元格从一个点发出,而不是emitterSize设置的单元格。
这是发射器:
emitter.emitterPosition = CGPoint(x: -50, y: (view.frame.height / 2))
emitter.emitterShape = kCAEmitterLayerLine
emitter.emitterSize = CGSize(width: 2, height: view.frame.height)我提到了emitterSize高度不起作用,因为如果我改变上面emitterSize的宽度,我可以看到宽度在适当地变化!不管我对身高有多高.就会被忽视。
和CAEmitterCells
cell.birthRate = 10
cell.lifetime = 10
cell.velocity = CGFloat(50)
cell.emissionLongitude = (45 * (.pi/180))如何将emitterSize宽度设置为2点宽和视图的高度?
发布于 2018-03-15 17:19:45
kCAEmitterLayerLine总是一条零厚度的水平线。只使用emitterSize.width。
通过将发射器层的转换设置为旋转,您可以垂直地使用线条形状。操场例子:
import UIKit
import PlaygroundSupport
class VerticalEmitterView: UIView {
let emitter = CAEmitterLayer()
override func layoutSubviews() {
super.layoutSubviews()
let bounds = self.bounds
emitter.position = CGPoint(x: bounds.midX, y: bounds.midY)
emitter.bounds = CGRect(x: 0, y: 0, width: bounds.size.height, height: bounds.size.width)
emitter.emitterPosition = CGPoint(x: bounds.width / 2, y: -50)
emitter.emitterSize = CGSize(width: emitter.bounds.size.width, height: 0)
if emitter.superlayer != self.layer {
emitter.setAffineTransform(CGAffineTransform(rotationAngle: -.pi / 2))
emitter.emitterShape = kCAEmitterLayerLine
let cell = CAEmitterCell()
cell.birthRate = 100
cell.lifetime = 10
cell.velocity = 50
cell.emissionLongitude = .pi
cell.color = UIColor.red.cgColor
let particleSize = CGSize(width: 5, height: 5)
let image = UIGraphicsImageRenderer(size: particleSize).image(actions: { (rc) in
UIColor.white.setFill()
let gc = UIGraphicsGetCurrentContext()
UIBezierPath(ovalIn: CGRect(origin: .zero, size: particleSize)).fill()
})
cell.contents = image.cgImage
emitter.emitterCells = [cell]
layer.addSublayer(emitter)
}
}
}
let rootView = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
rootView.backgroundColor = .white
let emitterView = VerticalEmitterView(frame: rootView.bounds)
rootView.addSubview(emitterView)
PlaygroundPage.current.liveView = rootView结果:

(不连续性是因为这个GIF是一个一秒的循环。)
发布于 2018-02-26 20:06:56
我也有同样的问题。从苹果的文档来看,如果发射器的形状是kCAEmitterLayerLine,它就会忽略发射器的高度。
我发现的一个不理想的解决方法是使用一个高度足够大的kcaEmitterLayerRectangle,这样矩形的一侧就是你想要的线条所在。
https://stackoverflow.com/questions/48605704
复制相似问题