gpt4 book ai didi

swift - 创建一个垂直的 CAEmitterLayer

转载 作者:搜寻专家 更新时间:2023-11-01 06:30:06 25 4
gpt4 key购买 nike

我正在努力创建一个与屏幕高度相同的 CAEmitterLayer,并推离 -X,因此 CAEmitterCells 从左侧(离开屏幕)移动到右上角。

我遇到了一个问题,CAEmitterLayer 的 emitterSize height 属性被忽略了。这会导致所有单元从一个点发射,而不是使用 emitterSize 设置的点。

这是发射器:

emitter.emitterPosition = CGPoint(x: -50, y: (view.frame.height / 2))
emitter.emitterShape = kCAEmitterLayerLine
emitter.emitterSize = CGSize(width: 2, height: view.frame.height)

我提到 emitterSize height 不起作用,因为如果我更改上面 emitterSize 的宽度,我可以看到宽度正确变化!无论我为高度设定什么值...它都会被忽略。

和 CAEmitterCells

cell.birthRate = 10
cell.lifetime = 10
cell.velocity = CGFloat(50)
cell.emissionLongitude = (45 * (.pi/180))

如何将 emitterSize 宽度设置为 2 点宽和 View 的高度?

最佳答案

kCAEmitterLayerLine 始终是零粗细的水平线。仅使用 emitterSize.width

您可以通过将发射层的变换设置为旋转来垂直使用线条形状。 Playground 示例:

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

结果:

emitter demo

(不连续是因为这个 GIF 是一个一秒的循环。)

关于swift - 创建一个垂直的 CAEmitterLayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48605704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com