18
1

More than 1 year has passed since last update.

Xcode-14.1 iOS-16.0

はじめに

SpriteKit をさわっているときに天啓が降りました:bulb:

Confetti のパーティクルをちょっといじれば UIView を砕けるのでは?

ということでやってみました。完成形はこんな感じです。

break

SKSファイル作成

昔は SpriteKit Particle File にデフォルトであった Confetti を少し修正して使います。設定はこんな感じです。

particle

実装

UIView の extension で SKView を使ってパーティクル表示を行うメソッドをはやします。

import UIKit
import SpriteKit

extension UIView {

    func `break`() {
        guard let window = window else {
            return
        }

        let skView = SKView(frame: window.bounds)
        skView.allowsTransparency = true
        window.addSubview(skView)
        let scene = SKScene(size: skView.frame.size)
        scene.backgroundColor = .clear
        skView.presentScene(scene)
        let point = convert(.init(x: frame.width/2, y: frame.height/2), to: window)
        if let particle = SKEmitterNode(fileNamed: "Confetti") {
            particle.particleColorSequence = nil
            particle.particleColorBlendFactor = 1.0
            particle.particleColor = backgroundColor ?? .white
            particle.position = scene.convertPoint(fromView: point)
            skView.scene?.addChild(particle)
        }
        UIView.animate(withDuration: 0.2, delay: 0, options: []) {
            self.alpha = 0.0
        } completion: { _ in
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
                skView.removeFromSuperview()
            }
        }
    }
}

あとは break() を呼び出すだけです。

View を砕く方法としては指定の View の Window に SKView をのせ、指定の View の中心座標に View の背景色を設定したパーティクルを表示しています。そしてパーティクル表示とともに View をフェードアウトさせるアニメーションをつけています。

改善案

いくつか改善案です。

  • Window ではなく superView か自身にのせる
    これはできそう
  • SKView ではなく CAEmitterLayer を使う
    パーティクルの設定方法がわからずうまくいきませんでした。。。
  • UIImageView とかも砕けるようにしたい
    View の細かい画像を取得してパーティクルに設定すればそれっぽくなりそうですがやり方がわからない。。。
  • リソース管理がめんどくさいので全部コードにする
    これはできそう

おわりに

これで UIView を砕き放題です!
みんなも好きな View を砕こう:boom:

18
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
1