[SwiftUI] SceneModifier の作り方

SwiftUI2021

     

TAGS:

⌛️ 2 min.
Scene に対しての カスタム SceneModifier の作り方を説明します。

環境&対象

以下の環境で動作確認を行なっています。

  • macOS Ventura 13.4
  • Xcode 14.3
  • iOS 16.4 beta

View と ViewModifer / おさらい

SwiftUI の View に対しては、ViewModifier を付与することで、さまざまな機能や飾りを付与することができます。

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, world!")
            Text("Hello, world!")
                .font(.largeTitle)
            Text("Hello, world!")
                .bold()
        }
        .padding()
    }
}

上記は、以下のような表示になります。

TextFontBold

Text(“Hello, world!”) という View に対して、.font や .bold という ViewModifier を付与することで、表示を変えることができることがわかります。

非常に便利です。

App / Scene / View のおさらい

View の上位の概念に Scene があります。

View は、その内部に View を持つこともできますが、最上位の View は、Scene に含まれることが必要であり、Scene は、App に保持されることで、アプリが構成されます。

classDiagram
App *--  Scene : body
Scene *--  View : body
View  *-- View : body

View は、階層的に複数の View を保持することができます。
Scene は、1つの View を持つことができます。
App は、複数の Scene を持つことができます。

Scene には、WindowGroup や、 Settings のような種類があります。

そして、Scene にも ViewModifier のような Scene を設定できる要素があります。
例えば、WindowGroup には、Window のスタイルを設定するための .windowStyle と言うものが用意されています。
Apple のドキュメントは、こちら

SceneModifier protocol はありません

View を便利に使うために、独自の View Modifier を作ることは、比較的一般に行われています。
Scene を扱う時にも 同じように 独自の Scene Modifier を作ろうとして困ったのがこの記事を書いたきっかけです。

独自の View Modifier を作るためには、ViewModifier という protocol に準拠した要素を作成していました。

ところが、ViewModifier の Scene 版である SceneModifier という protocol はないのです・・・

ViewModifier

ちなみに、ViewModifier のドキュメントは、こちら

以下の記事では ViewModifier の作り方を説明しています。
SwiftUI [SwiftUI] ViewModifierの作り方

Scene に modifier 相当を 作成する

SceneModifier という protocol はありませんが、以下のように Scene を extend することで、同じように使用することができます。

MEMO

もともと、ViewModifier というプロトコルがなくとも、extension で View に実装すれば 他の ViewModifier と同じように使用することができることを思い出しました。

extension Scene {
    func windowResizeability_macOS13() -> some Scene {
        if #available(macOS 13, *) {
            return self.windowResizability(.contentSize)
        }
        return self
    }
}

上記のような extension を作成すると、呼び出し側は以下のようになります。

WindowGroup {
    ContentView()
}
.windowStyle(.hiddenTitleBar)
.windowResizeability_macOS13()

見た目は、他の SceneModifier と変わりません。

MEMO

上記は、macOS13 以降で使用可能になった windowResizability を
macOS 13 以降でのみ指定するコードです。

まとめ

カスタム SceneModifier の作り方

カスタム SceneModifier の作り方
  • Scene を extension して作る
  • SceneModifier はない

説明は以上です。
不明な点やおかしな点ありましたら、こちらまで。

SwiftUI おすすめ本

SwiftUI を理解するには、以下の本がおすすめです。

SwiftUI ViewMatery

SwiftUI で開発していくときに、ViewやLayoutのための適切なmodifierを探すのが大変です。
英語での説明になってしまいますが、以下の”SwiftUI Views Mastery Bundle”という本がビジュアル的に確認して探せるので、便利です。

英語ではありますが、1ページに コードと画面が並んでいるので、非常にわかりやすいです。

View に適用できる modifier もわかりやすく説明されているので、ビューの理解だけではなく、どのような装飾ができるかも簡単にわかります。

超便利です

SwiftUIViewsMastery

販売元のページは、こちらです。

SwiftUI 徹底入門

# SwiftUI は、毎年大きく改善されていますので、少し古くなってしまいましたが、いまでも 定番本です。

Swift学習におすすめの本

詳解Swift

Swift の学習には、詳解 Swift という書籍が、おすすめです。

著者は、Swift の初期から書籍を出していますし、Swift の前に主力言語だった Objective-C という言語についても同様の書籍を出しています。

最新版を購入するのがおすすめです。

現時点では、上記の Swift 5 に対応した第5版が最新版です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です