View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

WWDC20に戻る

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • ウィジェットにおけるSwiftUIビューの構築

    ウィジェットはAppが提供する一部の情報を表示し、ホーム画面やTodayビューに配置することもできます。SwiftUIを用いて、ウィジェットのビューを最初から構築する手順をご説明します。ウィジェットに特化した構成に必要となるシンタックスをブラッシュアップし、そのコマンドを取り込み、一目で分かりやすい体験のためにウィジェットのインターフェースをカスタマイズする方法もお伝えします。ウィジェットについての更なる情報は"Meet WidgetKit"と"Widgets Code-along"をご覧ください。

    リソース

    • Building Widgets Using WidgetKit and SwiftUI
    • Creating a widget extension
    • Human Interface Guidelines: Widgets
    • Keeping a widget up to date
    • Learn more about creating widgets
    • WidgetKit
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC21

    • 優れたウィジェットの原則

    WWDC20

    • 優れたウィジェットをデザインする
    • SwiftUIの新機能
    • Widget Code-Along 1-冒険の始まり
    • Widget Code-Along 2 - 異なるタイムライン
    • Widget Code-Along 3 - アドバンシングタイムライン
    • WidgetKitについて
  • このビデオを検索

    こんにちは WWDCへようこそ “ウィジェットにSwiftUIビューを作成する” iOSシステムエクスペリエンスチームの エンジニアのニルスです 今日は ウィジェット用のSwiftUIビューを ビルドする方法をご紹介します

    最初に SwiftUIでウィジェットが どのように有効化されているかをお話しします 次にウィジェットのビューを 一緒にビルドすることをメインに据え 最後にウィジェットをすばらしいものにする 新しいAPIをいくつかお見せします

    SwiftUIとWidgetKitを使えば ビューのタイムラインを ホーム画面に適切なタイミングで 表示できます SwiftUIの適応性のおかげで iOSとmacOSの両方に デプロイするウィジェットを 書くことができます ウィジェットは自己完結型なので iOS 14やmacOS Big Surで SwiftUIを使ったり 学習したりするのに最適です たとえSwiftUIが非対応の古いOSに デプロイする必要があっても有益です 私は最近コーヒーをよく飲みます 飲みすぎる日もあるくらいです そこで私は 飲んでいるカフェイン飲料のログを 記録するアプリケーションを作りました これは体内のカフェインの 摂取量の推測することもでできます “ワイアード”と名づけました ウィジェットはすばらしい機能だと思います カフェインをどの程度 摂取しているかを 一目で確認できるからです ウィジェットを このような見た目したいとします

    まずアプリケーションの外観の特徴と 配色の方法を見てください 上部は現在の私の体内のカフェイン量で 下部は最後に飲んだの飲み物と経過した時間です

    カフェイン量の表示の背景に注目すると ウィジェットの形状と同心円状になっています

    またウィジェット下部の経過時間は リアルタイムで常に正確に表示しています

    では SwiftUIで 簡単に作成できるか試してみましょう

    すでにタイムラインを読み込んだ ウィジェットコンフィギュレーションなので ウィジェットのビューの作成に フォーカスできます 今回 私はSwiftUIを使って ウィジェットビューをビルドします つまり あなたのアプリケーションでも 同じように使えるということです

    これが私のビューと そのプレビューです Widget Preview Contextを使いながら 表示させたいウィジェットファミリーの プレビューを指示します この場合はsystem Smallです

    まずUIを駆動する データの構造体を定義してみましょう

    Caffeine Widget Dataには 3つのプロパティがあり それぞれカフェインの量と飲み物の名前 そして飲んだ日付です またプレビューをリアルに見せるために プレビュー値はsteady constantを使います

    ではプロパティを ビューに追加してみましょう

    次にプレビューデータを使うために プレビューを更新します

    これでビューのビルドを始められるので コンテンツを追加してみましょう

    ビューを縦に重ねるには VStackを使います 上部にある本文フォントが太字の “caffeine”という文字列には 定義済みのアセットカタログにある カスタムカラーが使われています

    その下に表示されている量は 大きなフォントですが 見た目は同じです フォントが大きい理由は レイアウト上で 必要ならば文字を縮小できるようにするためです なので ここで最小限のスケールファクタを 設定したのです

    次はウィジェットに 個性を与えてみましょう ZStackを使って背面に 背景色を付けてみます ZStackを使えば 互いのトップに ビューを重ねて配置できます

    お気づきでしょうが ウィジェットが自動的に 形状 サイズ 角丸をシステムから取得しました

    では 最後に飲んだ飲み物の名前と 経過時間の情報も加えていきます

    経過時間の表示に 新しいイニシャライザを使用しています それは日付とスタイルのフォーマットを 拾うものです このイニシャライザを使うと 指定した日付から時間の経過に従って 自動的にコンテンツが カウントアップまたはダウンします これは躍動感のあるウィジェットになる すばらしい方法です キャンバス内のlive previewボタンで 見え方を確認してみましょう 経過時間がカウントアップされています

    文字列補間を使って内容を追加できるので このように“ago”という言葉を追加しました

    文字列補間を使うとフレームワークが あなた用にローカライズされた文字キーを作成し このフォーマットが他の地域や 言語にも対応できるようになります

    テキストの色が異なる 2つのグループコンテンツがあります 上部にある茶色のテキストと その下にある白いテキストです これら2つをVStacksで分割し その間にSpacerを追加します このテキストをクリックし “Embed in VStack”を選択します

    このテキストをVStackの中に移動させます

    次にこのテキストも同様に “Embed in VStack”を選択します

    そして2番目のテキストを 内側に移動させます

    それから両者の間にSpacerを追加します

    両方のVStacksを左寄せにしてみます キャンバスを使う場合は vertical stackセクションの leadingボタンをクリックします

    ここと―

    ここです

    少し複雑になってきたので 下と上の部分を抽出して 固有のサブビューに分割します SwiftUIなのでビューが安く ほとんどコストがかかりません

    ここへ移動してVStackをクリックし “ExtractedView”を選択します これをCaffeine Amount Viewと 名づけましょう

    データを保持するために プロパティを追加しましょう

    それから下のVStackについても 同様に行います “Extract Subview”をクリックし これを“Drink view”と名づけましょう

    そしてここにも 同じプロパティを追加します

    最後にデータを動かしてみましょう

    見た目は同じですが よりよいコード構造でビルドできます

    中央寄せにする代わりに コンテンツを左寄せにします CaffeineAmountViewのコンテンツを HStack内にラップし最後にSpacerを追加します 移動して“Embed in HStack”を クリックします

    “HStack”つまり水平スタックを使用すると ビューを隣り合わせに配置できます 最後にSpacerを置くことで 左端に押し寄せるように指示を出しています

    最小間隔を必要としないため 最小の長さをゼロにすることで コンテンツができるだけ多くの スペースを取ることができます

    見栄えをよくするため パティングを追加してみましょう SwiftUIだからこそ キャンバスで できるのです メインのVStackにカーソルを置きます

    そしてAttributes Inspectorの paddingセクション内で 4つのチェックボタンをクリックします

    パディングで数値を 指定していないことが分かります 動作しているデバイスと コンフィギュレーションに対し SwiftUIが適切なデフォルト値を 使用するのです

    Caffeine Amount Viewを強調するための 指示を背景に出してみます

    アセットカタログにある “latte”という色を使います 4つのチェックボックスをクリックし 再度 パディングを追加します

    少し多すぎるので 数値を8にします

    この形状の角は 丸みを帯びていませんね Human Interface Guidelines for Widgetsにある通り 角丸四角形はウィジェットの ビジュアルデザイン言語の重要なパーツです ではこの角も丸めてみます

    このように角丸モディファイアの コードを使えるはずです

    よさそうな値を見つけてください しかし時に 別のデバイスがウィジェットの 半径を変えてしまうことがあり少し厄介です

    iOS14ではもっといい方法があります 新機能である Container Relative Shapeです

    これは新しい形状タイプのひとつです 形状の位置に基づいて 適切な角丸を持った親コンテナにより 最も近いコンテナ形状のパスを取得します この例ではシステムが ウィジェットのコンテナ形状を定義するので 同心円状の角の取得が とても簡単に行えます

    メインのVStackのパディングの値を変えると Caffeine Amount Viewの角半径が変化します そのため周りの境界線の太さが その角の曲線周りで一定に保たれるのです

    最後に一番大切なコンテンツを 指示しましょう Spacerを使って少し空間を作ります

    さあ 私たちが目指していた デザインが完成しました いいデザインだと思います ホーム画面に追加されるのが楽しみです ダークモードでの見え方を 確認してみましょう まずプレビューを複製してから モディファイアを追加してダークモードにします

    配色はすべて 外観を暗くする変化を定義した アセットカタログから引っ張っているので ウィジェットが自動的に ダークモードを適用します

    私の母もコーヒーをよく飲むので ワイアードを知ったらきっと喜ぶでしょう しかし母には下部の小さな文字が 読みにくいかもしれません そこで大きな文字を好む すべてのユーザーのために dynamic typeをサポートする ウィジェットに更新してみましょう まずは新しいプレビューを追加し より大きなサイズのカテゴリの ウィジェットを確認します

    ここではsize categoryを extra Extra Extra Largeにしました

    すばらしい見栄えです SwiftUIの適正のおかげで 何も変える必要がありませんでした そして追加作業なしで より包括的なウィジェットをビルドしました

    次にプレースホルダについてお話しします 優れたウィジェットには プレースホルダーが必要です 拡張からのビューを要求した場合や デバイスがブロックされた場合でも システムが使えるためです ウィジェットと同じ見た目ですが 具体的なコンテンツはありません プレースホルダーとしても使えるように ビューを修正してみましょう まず既存のものをコピーして 別のプレビューを作成します

    そして“is placeholder true” モディファイアを追加します

    自動的にコンテンツが入れ替わって テキスト部分が丸みを帯びた四角形になりました コンテンツにマッチするように スタイルが作られたのです

    プレースホルダに テキストを保存したい場合は “is placeholder false” モディファイアを追加します “caffeine”という言葉を 追加しましょう

    ウィジェットのプレースホルダとして使用することで ビューを更新しました 簡単ですね

    この“is placeholder”モディファイアは 後のシードで利用できるようになります ウィジェットは3つのファミリーで 構成されています smallとmediumそしてlargeです 別のウィジェットファミリーを使い ウィジェットの更新を見てみましょう system Mediumで別のプレビューを 追加して始めます

    よさそうに見えますが 余分なスペースがあります

    このアプリケーションではユーザーが 飲み物の写真を記録できます そこで写真をウィジェットに入れ 限られた画面を上手に使いましょう まず写真の名前を保存するために データ構造体にプロパティを追加します

    そしてプレビューアセットカタログから サンプル写真を追加します

    写真をビューに追加します system Mediumでは 飲み物の写真だけを表示させます この条件付きのレイアウトを作成するため ウィジェットファミリーに環境変数を追加します

    写真を既存のコンテンツの横に配置したいので すべてのコンテンツをHStack内にラップします

    もしsystem Mediumウィジェットで かつ写真を表示する場合は Imageを追加しましょう

    そしてresizableにします

    いいですね

    最後に 別のプレビューを追加して サイズ用プレースホルダを見てみましょう コツがつかめてきたでしょう 既存のものをコピーしてデモティファイを追加し プレースホルダーを作成します

    SwiftUIが自動的に画像を 背景着色されたコンテンツに置き換えましたね system Mediumのプレースホルダーを作成するのに 追加作業はしていません すごいでしょう? SwiftUIでウィジェットビューを ビルドすることはこんなに簡単です 先ほどデモでお見せした 2つの新しいAPIについてお話しします

    まずウィジェットで美しく見えるような 角丸の作り方です 角丸四角形を入れ子にする時 全く同じ角半径を使うことは避けたいでしょう 同心円状がいいはずです

    iOS14ならそれが難なくできます ビューの背景として Container Relative Shapeをセットすると SwiftUIがそこから取得します 簡単すぎるくらいです

    iOS14にはスタイルに従って 日付をフォーマットするための 新しいイニシャライザを テキストに追加しました そのためカウントダウンやタイマー 絶対日付や相対日付などを作ることができます これは時が経つにつれ 自動的に更新されるので 躍動感のあるウィジェットになる 優れた方法です

    では まとめましょう SwiftUIで魅力的なウィジェット体験を ユーザーに提供できます ウィジェットはSwiftUIに既存の 適用可能なレイアウト用のサポートを活用します

    ウィジェット間で共通した現象を より簡単にする新しいAPIを追加しました ウィジェットだけでなくどこでも動作するので ぜひアプリケーションにも使ってみてください

    ウィジェットのタイムラインの詳細は “Meet WidgetKit”をご覧ください また私の同僚のイジーの “Widgets Code-along”では ScratchからWidgetKitを使って ウィジェットを作る過程が見られます すてきなWWDCをお過ごしください ありがとうございました

    • 18:40 - Concentric corner radius with ContainerRelativeShape

      // Concentric corner radius with ContainerRelativeShape
      
      struct PillView : View {
          var title: Text
          var color: Color
      
          var body: some View {
              Text(title)
                  .background(ContainerRelativeShape().fill(color))
          }
      }
    • 19:09 - Displaying date and time

      // Displaying date and time
      
      // June 3, 2019
      Text(event.startDate, style: .date)
      
      // 11:23PM
      Text(event.startDate, style: .time)
      
      // 9:30AM - 3:30PM
      Text(event.startDate...event.endDate)
      
      // +2 hours
      // -3 months
      Text(event.startDate, style: .offset)
      
      // 2 hours, 23 minutes – Automatically updating as time pass
      Text(event.startDate, style: .relative)
      
      // 36:59:01 – Automatically updating as time pass
      Text(event.startDate, style: .timer)

Developer Footer

  • ビデオ
  • WWDC20
  • ウィジェットにおけるSwiftUIビューの構築
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン