0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftUIでローディング画面を自作してみたけど何か違う?

Posted at

動機

WWDC24で紹介されていた「Create custom visual effects with SwiftUI」1のRipple(波紋)エフェクトが頭に残っていてどこかに使いたいなと思ってました。
個人開発しているアプリ2のローディング画面にちょうどよいのでは?と思ってSwift Packageとして作ってみたのですが、なんかちょっと思ったのと違う気がしています…

製作物

output.gif

製作過程

WWDCのコードを参考にまずはざっくり作る

※以降の動画はQuizionary3という個人開発アプリに導入したときのGIFです

Simulator Screen Recording - iPhone 16 - 2024-09-30 at 19.39.23.gif

なんか違う、、、大きい?

サイズ調整可能にして、小さくしてみる

Simulator Screen Recording - iPhone 16 - 2024-09-30 at 19.42.26.gif

速度が微妙?

速度や振幅、振動数などのパラメータを調整

Simulator Screen Recording - iPhone 16 - 2024-09-30 at 19.44.54.gif

さらに調整

Simulator Screen Recording - iPhone 16 - 2024-09-30 at 08.54.53.gif

これ以上、無理そうなので完成!

苦労したところ

Metalシェーダを画像のようにリソース管理する必要があった点

  • Package.swiftに以下のようにしてリソースとして指定する必要がある
import PackageDescription

let package = Package(
    name: "LoadingImageView",
    platforms: [
        .iOS(.v17)
    ],
    products: [
        // Products define the executables and libraries a package produces, making them visible to other packages.
        .library(
            name: "LoadingImageView",
            targets: ["LoadingImageView"]
        ),
    ],
    targets: [
        // Targets are the basic building blocks of a package, defining a module or a test suite.
        // Targets can depend on other targets in this package and products from dependencies.
        .target(
            name: "LoadingImageView",
            dependencies: [],
            resources: [.process("Shaders/Ripple.metal")]
        ),
        .testTarget(
            name: "LoadingImageViewTests",
            dependencies: ["LoadingImageView"]),
    ]
)
  • 使うときは(bundle :.module)を以下のようにつける必要がある
        let shader = ShaderLibrary.bundle(.module).Ripple(
            .float2(origin),
            .float(elapsedTime),

            // Parameters
            .float(amplitude),
            .float(frequency),
            .float(decay),
            .float(speed)
        )

パラメータ調整が意外と難しい

  • 実際に組み込んでみないとわからないので、Swift Package側でコミット、Githubでリリースバージョン指定、利用するアプリ側で確認という手順を踏む必要があり、効率が悪かった
  • 実際のアプリで作ってから、Swift Package化という流れの方が絶対に良い!

参考

  1. https://developer.apple.com/videos/play/wwdc2024/10151/

  2. 紹介記事はこちら

  3. https://apps.apple.com/app/quizionary/id6630366339

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?