求iOS Swift实现按钮点击粒子效果的代码示例(参考Leonids)
当然有啦!在iOS上用Swift实现你展示的这种点击触发的彩色粒子爆发效果,用原生的SpriteKit就能轻松搞定,不需要额外依赖第三方库(当然也有类似Leonids的第三方库可选,但原生方案已经足够灵活好用)。下面给你一个完整的代码示例,一步一步实现点击按钮触发粒子效果:
iOS Swift 实现点击触发粒子效果示例
核心思路
我们用SpriteKit的SKEmitterNode来创建粒子效果,它可以灵活控制粒子的发射角度、速度、颜色、生命周期等参数,完美匹配你展示的效果。
完整代码实现
import UIKit import SpriteKit class ParticleDemoViewController: UIViewController { private var skView: SKView! override func viewDidLoad() { super.viewDidLoad() setupSpriteKitView() setupTriggerButton() } // 初始化SpriteKit视图,用来承载粒子效果 private func setupSpriteKitView() { skView = SKView(frame: view.bounds) skView.backgroundColor = .white view.addSubview(skView) let scene = SKScene(size: skView.bounds.size) scene.backgroundColor = .white skView.presentScene(scene) } // 创建触发按钮 private func setupTriggerButton() { let triggerBtn = UIButton(type: .system) triggerBtn.setTitle("点击触发粒子效果", for: .normal) triggerBtn.titleLabel?.font = .systemFont(ofSize: 18, weight: .bold) triggerBtn.addTarget(self, action: #selector(burstParticles), for: .touchUpInside) triggerBtn.translatesAutoresizingMaskIntoConstraints = false view.addSubview(triggerBtn) // 按钮居中布局 NSLayoutConstraint.activate([ triggerBtn.centerXAnchor.constraint(equalTo: view.centerXAnchor), triggerBtn.centerYAnchor.constraint(equalTo: view.centerYAnchor) ]) } // 触发粒子爆发的核心方法 @objc private func burstParticles() { guard let currentScene = skView.scene else { return } // 创建粒子发射器节点 let emitter = SKEmitterNode() // 设置粒子纹理:这里用系统的圆形填充图标,你也可以换成自定义的粒子图片 guard let particleImage = UIImage(systemName: "circle.fill") else { return } emitter.particleTexture = SKTexture(image: particleImage) // 设置粒子彩色序列,模拟你展示的多色粒子 emitter.particleColorSequence = SKKeyframeSequence(keyValues: [ UIColor.systemRed, UIColor.systemGreen, UIColor.systemBlue, UIColor.systemYellow ], times: [0, 0.25, 0.5, 0.75]) // 粒子发射范围:从按钮周围小区域内发射 emitter.particlePositionRange = CGVector(dx: 40, dy: 40) // 360度全方位发射粒子 emitter.emissionAngle = .pi * 2 emitter.emissionAngleRange = .pi * 2 // 粒子运动参数 emitter.particleSpeed = 160 emitter.particleSpeedRange = 60 // 粒子速度有差异,更自然 emitter.particleLifetime = 1.4 // 粒子存活时间 emitter.particleLifetimeRange = 0.6 // 粒子大小变化:从初始大小逐渐缩小 emitter.particleScale = 0.2 emitter.particleScaleRange = 0.1 emitter.particleScaleSpeed = -0.2 // 粒子透明度变化:逐渐消失 emitter.particleAlpha = 1.0 emitter.particleAlphaSpeed = -0.7 // 将发射器位置设置为按钮的中心 if let btn = view.subviews.first(where: { $0 is UIButton }) { emitter.position = skView.convert(btn.center, from: view) } // 添加到场景,粒子结束后自动移除节点 currentScene.addChild(emitter) emitter.run(.wait(forDuration: emitter.particleLifetime + 0.5)) { emitter.removeFromParent() } } }
参数调整建议
如果你想更贴近你展示的gif效果,可以调整这些参数:
particleTexture:换成更接近原效果的粒子图片(比如带点渐变的小圆形)particleSpeed:调小一点可以让粒子运动更缓慢particleLifetime:延长时间让粒子停留更久particleScale:调整初始粒子大小
另外,如果你偏好第三方库,也可以找类似Leonids的iOS粒子库,但原生SpriteKit的可控性更强,不需要额外引入依赖。
内容的提问来源于stack exchange,提问作者Seize Duh
相关产品推荐
相关产品推荐

