ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
UIKitの新機能
UIKitの機能強化や、アップデートについて確認し、より優れたiOS、iPadOS、Mac Catalystアプリの作成方法について学びます。UIKitの最新機能と改善点を紹介し、APIの改善点や、パフォーマンスの向上について解説します。
関連する章
- 1:23 - Key feature: Xcode previews
- 2:08 - Key feature: View controller lifecycle
- 5:09 - Key feature: Trait system enhancements
- 6:26 - Key feature: Animation symbol images
- 7:49 - Key feature: Empty states
- 9:51 - Internationalization
- 13:34 - iPad: Document support
- 13:55 - iPad: Window dragging
- 14:47 - iPad: Sidebar and Stage Manager
- 16:56 - iPad: Apple Pencil
- 19:33 - iPad: Keyboard scrolling
- 20:21 - General: Collection views
- 23:03 - General: Spring animations
- 24:03 - General: Text interactions
- 25:12 - General: Status bar
- 26:19 - General: Drag and drop
- 27:00 - General: HDR images
- 27:34 - General: Page control
- 28:42 - General: Palette menus 🎨
- 30:08 - tvOS menus
リソース
関連ビデオ
WWDC23
- より優れたドキュメントベースのアプリを構築
- アプリでシンボルをアニメーションする
- アプリ内でのHDR画像のサポート
- テキストとテキストインタラクションに関する最新情報
- Springsでアニメーション生成
- UIKitトレイトシステムの活用
WWDC20
-
ダウンロード
♪ ♪
こんにちは “What's new in UIKit”へ ようこそ UIKitチーム エンジニアリング マネージャーのDimaです アプリを支える強力な フレームワークであるUIKitが iOS 17の新機能をサポートするために アップグレードされました この動画でその概要をご紹介します 主な新機能とコアアーキテクチャの改善 言語設定にとらわれない すべてのユーザーのための インターフェース構築に関する改善 iPadOSアプリの改善 そして 今回のリリースに含まれる 多くの基本的機能の強化があります
UIKitに大規模な アーキテクチャの改善を施し 強力なアプリの作成を容易にするとともに SwiftUIとの統合を劇的に改善しました これから5つの主な新機能を紹介します Xcodeプレビューのサポート ViewControllerの ライフサイクルの更新 traitシステムの進化 シンボル画像のアニメーション アプリの空の状態を表現する 新規APIについて説明します
最初に 大きな変更からです UIKitでXcodeのプレビューを 直接使用可能になりました この機能を利用するには Previewマクロを使って プレビューの名前を指定し ViewControllerを返します ViewControllerに 任意のプロパティを設定して プレビューの設定を行い データの追加が可能です
また ViewControllerを使わずに UIViewsを直接プレビュー可能です プレビューは UIコンポーネントを視覚化し コードの記述時に即座に フィードバックを得ることができます 一度アプリを作成すれば Xcodeプレビューは 様々な構成や設定でのテストを可能にします 次に ViewControllerを表示する時や ナビゲーションコントローラーを プッシュしたりポップする時など 外観が変化する時の ViewControllerの ライフサイクルの 大きな改善点について説明します viewIsAppearingという 新たなViewControllerコールバックは viewWillAppearの後 そして viewDidAppearの前にコールされます viewIsAppearingはViewが現れるたびに 何かを行うのに最適です これをコールすると ViewControllerと Viewの両方が最新の traitコレクションを保持します さらに Viewは階層に追加され Superviewによってレイアウトされます このため viewIsAppearingは Viewのサイズなど 初期ジオメトリに依存するコードを 実行する理想的なコールバックになります 最後に この新しいviewIsAppearingメソッドは iOS 13までさかのぼってデプロイされるので アプリが古いバージョンの iOSで動作していても このメソッドを活用できます
こちらは 新しいviewIsAppearing コールバックが 典型的なViewControllerの 見た目の変化における 他の主なイベントとどのように 適合するかを示しています いくつか解説したい点があります
まず Viewが階層に追加される前 そしてレイアウトが始まる前に viewWillAppearがコールされています このためtraitコレクションを使用したり Viewのサイズや 他のジオメトリに依存することを 行うには早すぎるのです
次に viewDidAppearがアニメーションの後 最後に別のCATransactionで コールされています つまりviewDidAppearで行った変更は トランジションが完了するまで表示されず トランジション中に表示したい 変更を行うには遅すぎるのです 一方 viewIsAppearingは viewWillAppearと同じ トランジション内でコールされます つまり これらのコールバックの どちらかで行った変更は トランジションの最初のフレームから 同時にユーザーに見えるようになります
最後に タイミングは似ていても viewIsAppearingと viewWillLayoutSubviewsのような レイアウトコールバックには 大きな違いがあります
レイアウトコールバックはViewが layoutSubviewsを実行するたびに行われます これは トランジション中に 複数回行われることもあれば Viewの表示中に 後で行われることもあります
しかし viewIsAppearingは アピアランストランジション中に 一度だけコールされ Viewにレイアウトが 必要ない場合でもコールされます ですから 私はviewIsAppearingを Goldilocksコールバックと 呼んでいます 早すぎず 遅すぎず 頻度が多すぎず ちょうどいいからです またUIKitのtraitシステムが iOS 17でアップグレードされました Traitは アプリの階層を通じて データを自動的に伝達します UITraitCollectionには ユーザーインターフェーススタイル 水平 および垂直サイズクラス 優先コンテンツサイズカテゴリなど 多くのシステム特性が含まれています
UITraitCollectionに独自のデータを 追加する カスタムTraitを定義できます これは アプリ内のViewや ViewControllerに データを伝達する全く新しい方法です
また ViewやViewControllerの 特性値を簡単に変更できる TraitオーバーライドAPIも 新たに追加されました
また traitCollectionDidChangeを サブクラスでオーバーライドする必要が無く traitの値が変化した時に コールバックを受け取る より柔軟なAPIの使用も可能になりました
最後に アプリ内のUIKitと SwiftUIコンポーネント間で シームレスにデータを渡すために カスタムUIKit traitsを SwiftUI環境キーにブリッジできます
これらの新機能の詳細については “Unleash the UIKit trait system” 動画をご覧ください
すべてのプラットフォームで SFシンボルは ツールバーアイコン ナビゲーションバー その他のUI要素間で 一貫した外見を提供します テキストラベルと自動的に 整列するように設計されており アプリのデザインに合わせて ウェイト スケール 外見を 簡単にカスタマイズ可能です iOS 17では UIKitは 新たなシンボルエフェクトAPIで シンボルのアニメーションを サポートしています これらのエフェクトは 独自のものを含む あらゆるシンボル画像に適用できます
エフェクトを適用するにはUIImageViewの addSymbolEffect()メソッドを使用します ここでは バウンスエフェクトを追加して シンボルを1回跳ねさせています 次に バリアブル カラーエフェクトを追加してみます バウンスと異なり 追加すると継続してアニメーションします removeSymbolEffect()メソッドを 使用してエフェクトを終了します 最後に 新しい setSymbolImage()メソッドを使って シンボル間のトランジション エフェクトを実行してみます
今回ご紹介した3つ以外にも さまざまなシンボルエフェクトがあります 詳しくは“Animate symbols in your app”動画をご覧ください 次に 空の状態を簡単に表現する 新規APIが追加されました 空の状態とは アプリの中で表示する コンテンツが無い状態のことです
一般的には アプリを最初に起動して コンテンツが 作成されてない状態で発生します インターネットに 接続されていないなどの制約により アプリがコンテンツを 表示できない場合にも発生します UIContentUnavailableConfigurationは 空の状態を記述したもので 画像やテキストなどの プレースホルダー コンテンツを提供できます この例では 表示するお気に入りの 翻訳がないことを知らせています 空の状態を表現するために ViewControllerを contentUnavailableConfigurationに 設定します .empty()設定に加えて UIKitは準備中のコンテンツを表現する .loading()設定も提供しています さらに SwiftUI Viewでアプリの 空の状態を表現するために UIHostingConfiguration APIを 活用することができます これはUIHostingConfigurationを セルで使うのと同様に動作します
ViewControllerの コンテンツ利用不可設定を 更新するために 最適な場所は updateContentUnavailableConfiguration (using: state)の中です
この例では 結果を返さないクエリ用に デザインされた .search設定を使用しています この設定では ローカライズされた 主テキストと副テキストが提供され クエリは 直近の 検索コントローラーから補完されます
ViewControllerのコンテンツの 利用可能状態が変わるたびに setNeedsUpdateContentUnavailable Configurationをコールし更新を要求します Appleのすべてのプラットフォーム間で 言語設定に関係なく 一貫した高品質の エクスペリエンスを 提供することが必要不可欠です それを手助けするために フォントとテキストレンダリングが 大きな進歩を遂げました
このセクションでは 特定のフォントや 言語におけるテキストのクリッピングや 衝突を防止する ダイナミック ラインハイト調整についてお話します また 改行やハイフネーション規則の改善や ロケールに応じた画像を要求するための 新APIもご紹介します まず フォントとそのメトリクスについて 詳しく見てみましょう
フォントのメトリクスは いくつかの用語で定義されています ベースラインは 文字や単語を乗せる 架空の線を表しています ラインハイトとは このベースラインと ベースラインの間の空白のことです そして Xハイトは小文字の上側の線です
フォントによって これらの線からはみ出す アセンダーやディセンダーがあります アセンダーはXハイトより 上に伸びているフォントの部分です 一方 ディセンダーは ベースラインの下の部分です アラビア語 ヒンディー語 タイ語など 一部の言語では これらの要素はラテン文字より 大きな縦のスペースを必要とするため 衝突やクリッピングの問題が 発生することがあります そこで すべての言語でアセンダーや ディセンダーの重なりを防止するため ダイナミックラインハイト 調整機能を導入しました これにより UILabelsなどのテキスト要素は 読みやすさを考慮して自動的に ラインハイトと縦の寸法を 調整できるようになりました また 中国語 ドイツ語 日本語 韓国語などの 言語における改行動作も大幅に改善しました
これらの改善により 使用しているテキストスタイルの 種類に応じて 異なる規則が適用されます
これは テキストスタイルを使用していれば ほとんどの場合 自動的に機能しますが ベストプラクティスや アプリをすべての言語で 動作させる方法については “What's new with Text and Text Interactions”をご覧ください 特定の状況下では UIのかなりの部分が ユーザーが選択した言語と 異なる言語で表示されることがあります 例えば ウェブ由来のコンテンツなどです この場合 新しいtypesettingLanguage traitを使用して インターフェース言語を示すと それに応じてラインハイトや ハイフネーション規則を調整できます UIKitは特定のローカライズ画像への アクセスをサポートします 例えば .textbox SF Symbolには 8つのロケールに応じたシンボルがあります
デフォルトでUIKitは デバイスの現在の言語設定に一致する シンボルを使用します 現在の言語が米国英語であれば ラテン語版が表示されます
iOS 17では 画像の設定に Localeを指定することで アプリが特定のバリアントを 要求できるようになりました ここでは ロケールを 日本語に設定することで 日本語版のシンボルを 呼び出しています テキストレンダリングとロケールの サポートにこれらの変更が加えられ アプリはすべての人に 身近に感じられるでしょう
次に iPad向けアプリの制作における 改善点を紹介します
5つの機能で改善されました 新しいウィンドウのドラッグ操作 Stage Managerのサイドバー動作の向上 キーボードスクロールのサポート ドキュメント主体のアプリ構築の進化 新しいApple Pencilの機能とAPIです
iOS 17では Stage Managerの ウィンドウドラッグ機能を アップデートし ドラッグジェスチャーを 開始できる領域を拡大しました
UINavigationBar内のどこでも ドラッグできるようになり ウィンドウの移動が開始されます このジェスチャーは パンやスワイプなど アプリで使用する可能性のある 他のジェスチャー認識機能と 連携して動作します アプリのUIとしてUINavigationBarを 使用していない場合は, UIWindowSceneDragInteractionを使用し 任意のViewに追加できます また アプリ内の他のパンジェスチャーとの 関係を設定し 競合が起こらないようにできます これは Mac Catalystでもすぐに使えます コラムスタイルの UISplitViewControllersは Stage Managerで リサイズ操作が可能になりました サイドバーは 必要に応じて自動的に隠され 表示を要求されるまで 隠されたままになります サイドバーが狭い横幅で要求されると UISplitViewControllerは必要に応じて オーバーレイや移動を行います
オーバーレイされたサイドバーはウィンドウ サイズが大きくなっても保持されます 解除して 広い幅で再び呼び出すと タイルの状態に戻ります Mailのような3分割の ViewControllerも同様に動作します この新しい動作は 2分割または3分割された コラムスタイルで作成された UISplitViewControllersで機能します まとめると 自動で可能な限り コラムをタイル状に並べ 幅が狭くなると 必要に応じてサイドバーを隠し サイドバーボタンがタップされた時に タイル表示用のスペースが 十分ではない場合に2番目のコラムを サイドバーに重ねるかずらし アプリではusing preferredDisplayModeと preferredSplitBehaviorを使って 動作をオーバーライドできます iPadOS 17ではドキュメントベースの アプリのサポートが改善されました UIKitはコンテンツビュー コントローラーの 新しいベースクラスとなる UIDocumentViewControllerを提供します システムデフォルトの エクスペリエンスを提供し タイトルメニューの自動設定 共有 ドラッグアンドドロップ キーコマンドなど 多くの機能を追加設定なしで使用できます さらに UIDocumentは UINavigationItemRenameDelegateに準拠し ViewControllerの ナビゲーションアイテムの リネームデリゲートに設定することで リネームエクスペリエンスを提供します 文書管理に重点を置いたアプリ向けの これらの新機能や その他の新機能の詳細については “Build better document-based apps”を ご覧ください Apple Pencilは iPadOS Appに新たな側面をもたらします 新しいAPIも数多くあります
新しいiPad ProとiOS 16.4では Apple Pencilを使った ホバー機能を導入しました ホバー状態を検出するには UIHoverGestureRecognizerを使います zOffsetは スクリーンからの ホバー距離を正規化し 0から1の範囲で取得します ホバー範囲にある時にPencilの 高さと方位角を検出して ブラシストロークが 画面上でどのように見えるかの プレビューを正確に描画できます
Pencilホバーでは ホーム画面や アプリのツールバーアイコンにも ホバーが適用されます UIPointerInteractionを使用していれば 追加の作業は必要ありません ただし マウスや トラックパッドによる入力と Apple Pencilによる 入力を使用した場合の ビジュアルインタラクションは 若干異なります 例えば システムポインタのような ポインタスタイルは Apple Pencilの使用中は表示されません
皆さんのアプリでも Pencilホバーをお試しください
iOS 17では PencilKitの表現力がさらに増し 新しいインクが導入されました モノラインペンはディテールに優れ 一定サイズの幅で使用できます 万年筆はカリグラフィーを再現し 太いダウンストロークと 細いアップストロークが特徴です 水彩は 美しいストロークと 表現を可能にします クレヨンは新たに追加されました 新しいインクについては 後方互換性を念頭においてください 以前のバージョンのiOSでは 新しいインクを 使用したPKDrawingsをロードできません
PKDrawingやPKStrokeなどの データモデルタイプの 新しいコンテンツバージョンの プロパティには オブジェクトのロードに 必要となるPencilKitの バージョンが示されています コンテンツバージョン1は iOS 14で追加されたインクを示し 2はiOS 17で新規に 追加されたインクを示しています
良好なユーザーエクスペリエンスを 提供するため このAPIを使用して 非互換性を検出し メッセージを表示するか フォールバック 画像をレンダリングしてください 後方互換性を維持できない場合は maximumSupportedContentVersion APIを 使用して キャンバスとツールピッカーで 使用できる機能を制限できます
iPadをMagic Keyboardのような ハードウェアキーボードと組み合わせ さらに強化するために キーボードスクロールがサポートされました iOS 17の新機能として UIScrollViewsを使うと Page Up Page Down Home Endキーがあれば スクロール操作が可能です UIScrollViewの新API allowsKeyboardScrollingを使うと この動作をオーバーライドできます 最後に UIKitの 複数の分野で導入された 基本的な機能における
8つの改善についてお話します コレクションビューの改善 新しいスプリング アニメーションパラメータ テキストインタラクションなどの内容です
まず iOS 17で 多くのパフォーマンスが 大幅に最適化された コレクションビューをご紹介します このグラフは iOS 17で 大量のアイテムを使った操作を行う際の コレクションビューの 高速化の度合いを示しています
iOS 17では1万個のアイテムを含む コレクションビューの ソート順を反転させる際に iOS 16よりも約2倍高速化され そのうちの半分のアイテムの削除を 実行する際に およそ3倍高速化されています さらに アニメーションを使用しないで 更新を行うと コレクションビューの パフォーマンスはさらに向上します Diffable DataSourceに スナップショットを適用する場合でも 手動でバッチアップデートを 実行する場合でも iOS 17ではコレクションビューが 全体的に高速化されています これらの改善により アプリの応答性が向上し 結果的にアプリの不具合も減少します では 強力な新機能 Compositional Layoutについて ごく一般的なレイアウトを 例に挙げて説明します これはiPadの新しいヘルスケアアプリです お気に入りセクションは2つのアイテムが 並ぶ複合レイアウトを使用しており NSCollectionLayoutDimension.estimatedを 使ってセルフサイジングしています 薬のセルの高さが 隣のセルの高さと 一致していないことにご注目ください これらのアイテムが同じ高さであれば もっと見栄えが良くなるはずです
iOS 17ではCompositional Layoutに 新しいレイアウトディメンション uniformAcrossSiblingsが追加されました
この新機能により レイアウト内の セルフサイジングアイテムが 最大サイズのアイテムに合わせて 一貫した大きさになります このレイアウトを使用する場合は 推定サイズを uniformAcrossSiblingsに置き換えます この機能を使用する場合 すべての子アイテムを作成し 最も大きいアイテムの サイズを決定する必要があるため グループ内に多数のアイテムがある場合は 使用を避けてください
ヘルスケアアプリの例に戻ります このグループには高さが異なる 2つのアイテムがあります レイアウト内のすべてのアイテムを uniformAcrossSiblingsを使うように更新し 薬のセルの高さを環境音レベルの セルの高さに合わせ 望み通りのレイアウトになりました 次は スプリングアニメーションです 私たちは より分かりやすく 作業しやすい パラメータの指定方法に 磨きをかけています
使用するパラメータは DurationとBounceの2つだけです
Durationは スプリングアニメーションが 完了するまでの長さではなく アニメーションが 落ち着くまでの時間を定義しており Bounceとは独立しています Bounceをゼロから増やすと アニメーションの長さを変えずに 跳ねるアニメーションが加わります
バネのパラメータを受け取る UIViewのメソッドを追加しました これらはすべてオプションなので “animate”と書くだけでも システムデフォルトと一致する スプリングアニメーションが発生します
このスプリングの記述方法については “Animate with Springs”をご覧ください
次に テキストを操作するための 新機能とAPIについて説明します iOS 17では デザインを一新した 選択ルーペをはじめ テキストカーソルや テキスト選択UIが 大きく改良されました ワードプロセッサなどの カスタムテキストビューを使用するデベロッパは UITextInteractionを使用しなくても システムが提供するビューを 選択UIに利用できます
UITextViewDelegateの新APIにより テキストビューにおける テキストアイテムの操作が よりカスタマイズ可能となり リンクやテキスト添付などの テキストアイテムの 主要なアクションや メニューの変更が可能になりました
さらに コンテンツのカスタム範囲に タグ付けして インタラクションを可能にできるので リンクではないテキストに アクションやメニューを簡単に追加できます
テキストカーソルの改善点 テキストアイテムの アクションとメニューについては “What's new with text and text interactions”をご覧ください 次に iOSですでに定評のある ステータスバーについて 最新情報をお届けします iOSのステータスバーのスタイルは その下にあるアプリによって制御され デフォルトのスタイルは アプリや ViewControllerが ダークモードやライトモードに 応じて切り替えます ユーザーコンテンツの場合 コントラストの確保が困難な場合があります
ここでは アプリがライトを使用しており スタイルがダークになっています しかし 一部の ユーザーコンテンツはダークです
iOS 17では デフォルトのスタイルが アプリのコンテンツに合わせて 継続的に調整され コントラストを維持するために ダークとライトスタイルを 自動的に変更します さらに 必要に応じてステータスバーが スタイルを分割できます
すべてのケースでアプリが 明示的にダークとライトを 指定する必要がなくなったため カスタムコードを削除して デフォルトのスタイルを 利用することができます iOS 17では ドラッグアンドドロップが さらに強化されました サポートされているファイルやコンテンツを ホーム画面にドロップして それぞれのアプリで直接開くことができます これは 多くのドキュメント主体のアプリで 変更の必要なく 今日から自動的に機能します システムは アプリのInfo.plist ファイルで定義されている CFBundleDocumentTypesを使用して ドロップされたファイルが サポートされているかどうかを判断します ドロップすると 他のURLと同様に 既存のシーンデリゲートメソッドを使って ファイルが開かれます アプリがサポートする ドキュメントタイプを定義して この機能を利用できるようにしてください UIKitにISO HDR Imagesの サポートが追加され UIImageViewで画像を簡単に表示し UIGraphicsImageRendererで 操作できるようになりました
さらに 新しいUIImageReaderでは カメラロールからの画像など 一部のHDR画像形式を ISO HDRに変換するなど 画像を読み込む際に より多くの操作が可能になっています 詳しくは“Support HDR images in your app”をご覧ください
UIPageControlに ページの進行を 表現する新機能が追加されました 現在 ページコントロールは 設定時間で自動的にページが進む スライドショーコンテンツや ビデオコンテンツを 表示するアプリでよく使用されています 新しいProgressとTimer Progress APIでは ページの切り替わりについて より良いコンテクストを提供するため アクティブインジケータで ページの進捗を表現できます 部分的な進捗のページコントロールを 設定するには UIPageControlのProgressプロパティに 該当オブジェクトを設定します
UIPageControlTimerProgressには 各ページの継続時間を簡単に 設定できるタイマーが内蔵されています
UIPageControlは タイマーの継続時間が 満たされると自動でページを変更します
ビデオプレーヤーや外部タイマーに 従う必要があるページでは 独自の情報ソースが存在するため ベースのUIPageControlProgressタイプを 使用して コンテンツの進行に応じて currentProgress値を手動で更新します iOS 17とmacOS Sonomaに Palette Menusが導入されました
Palettesは一般的に アイテムをコレクションから 選択する際に使用される 横並びのメニューです このスタイルのコントロールは iOSの「ブック」アプリや Macの「メール」や 「Finder」で見ることができます 今回 UIKitのファーストクラス コントロールとして利用可能になりました メニューをパレットにするには オプションにこのように .displayAsPaletteを追加します
パレットの要素は比較的小さいので 通常のメニューのようにチェックマークで 選択範囲が示されることはありません 代わりに UIKitは 提供された画像に基づいて 適切な選択インジケータを選択します パレット内の要素がモノクロの SF Symbolsの場合 またはテンプレート画像の場合 選択された要素は アプリの色合いで着色されます 複数の色のSF symbolsの場合 選択された要素の周囲が着色されます メニュー要素に完全にカスタム化された 画像を使う場合 または内蔵された動作をオーバーライドして 独自の選択インジケータを使用する場合は UIMenuLeafプロトコルの selectedImageプロパティを使用します この例では UIActionのイニシャライザに selectedImageが設定されています
UIKitのメニューAPIは iOS iPadOSとMac Catalystで利用でき 使い慣れた同じAPIで 複雑なメニューを構築できます そして tvOS 17からは すべての同じAPIが Apple TVで使用可能になり 見た目も一新され tvOSネイティブで動作します Wow! 色々な分野をカバーしましたね UIKitは様々な機能を獲得し その能力をさらに高めています
次のステップです iOS 17 SDKを使って アプリをコンパイルしましょう UIKitの新機能を取り入れ プロジェクトでXcodeの プレビューを活用しましょう また 非ラテン語のテキストメトリクスの 変化に対応できるよう UIの柔軟性を確保しましょう これらのトピックを お楽しみいただけたでしょうか 詳細については関連動画をご覧ください ありがとうございました ♪ ♪
-
-
1:31 - Using Xcode previews with view controllers
class LibraryViewController: UIViewController { // ... } #Preview("Library") { let controller = LibraryViewController() controller.displayCuratedContent = true return controller }
-
1:48 - Using Xcode previews with views
class SlideshowView: UIView { // ... } #Preview("Memories") { let view = SlideshowView() view.title = "Memories" view.subtitle = "Highlights from the past year" view.images = ... return view }
-
8:19 - Setting up UIContentUnavailableConfiguration
var config = UIContentUnavailableConfiguration.empty() config.image = UIImage(systemName: "star.fill") config.text = "No Favorites" config.secondaryText = "Your favorite translations will appear here." viewController.contentUnavailableConfiguration = config
-
8:56 - Using UIContentUnavailableConfiguration with SwiftUI
let config = UIHostingConfiguration { VStack { ProgressView(value: progress) Text("Downloading file...") .foregroundStyle(.secondary) } } viewController.contentUnavailableConfiguration = config
-
9:21 - Using UIContentUnavailableConfiguration for search results
override func updateContentUnavailableConfiguration( using state: UIContentUnavailableConfigurationState ) { var config: UIContentUnavailableConfiguration? if searchResults.isEmpty { config = .search() } contentUnavailableConfiguration = config } // Update search results for query searchResults = backingStore.results(for: query) setNeedsUpdateContentUnavailableConfiguration()
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。