ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
UIKitの新機能
タブやドキュメントの起動時の体験、トランジション、テキストおよび入力に関する変更点など、UIKitの最新情報のすべてをご紹介します。また、これまで以上に向上した、アニメーションおよびジェスチャに関するUIKitとSwiftUIの相互運用性のほか、UIKit全体の全般的な改善点についても解説します。
関連する章
- 0:00 - Introduction
- 0:55 - Document launch experience
- 1:24 - Updated tab and sidebar
- 2:43 - Fluid transitions
- 3:35 - SwiftUI animations in UIKit
- 4:24 - Coordinated gesture recognizers
- 6:02 - Automatic trait tracking
- 7:44 - List improvements
- 11:18 - UIUpdateLink
- 12:55 - SF Symbol animations
- 14:36 - Sensory feedback
- 16:14 - Text improvements
- 18:14 - Menu actions
- 18:58 - Apple Pencil Pro and PencilKit
リソース
関連ビデオ
WWDC24
WWDC23
WWDC21
-
ダウンロード
こんにちは 「UIKitの最新情報」へようこそ UI Frameworksチームのマネージャ Dimaです
iOS 18ではUIKitに 多くの機能強化が加えられています このセッションでは次の点について説明します 新しい主な機能とUIの改善点 同じアプリ内での UIKitとSwiftUIのさらなる統合 一般的な機能強化とAPIの追加
UIKitには ユーザーインターフェイスを効率化し より快適に使用できるようにするための 大きな改善が加えられています
ここでは 主な機能を3つ紹介します ドキュメントの起動体験の改善 タブとサイドバーの大幅なアップデート システム全体での新しいスムーズな トランジションのサポートです
まず ドキュメントベースアプリの 起動時の体験が再設計され アプリの独自性を 際立たせることができるようになりました 起動時のビューのデザインを完全に制御し テンプレートからのドキュメント作成に対して 優れたサポートを提供することで 初めてドキュメントを作成するユーザーを スムーズにガイドしながら 優れたブラウズ体験も維持できます 詳細については関連するセッションの 「Evolve your document launch experience」をご覧ください 次にタブバーの外観が新しくなり サイドバー体験とカスタマイズ機能が 新たに組み込まれました iPadOS 18では タブバーがコンパクトな外観に一新され 縦方向と横方向の空白が減り アプリのコンテンツが前面に 表示されるようになりました 既存のサイドバーアプリは 新しいUITabBarController APIを採用して タブとサイドバーを組み合わせた体験を 実現しています 最小化すると サイドバーはタブバーに戻ります これでアプリのコンテンツが 常に目立つようになります
新しいバーでは タブバーを使用して すばやく移動できると同時に サイドバーからアプリのより深い セクションにアクセスできます 新しいバーには カスタマイズ機能も備わっており ドラッグ&ドロップでサイドバーと タブバーをパーソナライズできます
新しいUITab APIと UITabGroup APIを使うと アプリで構造を記述して タブバーとサイドバーを構築できます
さらに Mac CatalystとvisionOSの両方で ネイティブ体験に適応します 詳しくは 「Elevate your tab and sidebar experience in iPadOS」をご覧ください iOSでは トランジションを使用して アプリの様々な部分の視覚的なリンクと ナビゲーションを実現します iOS 18には新しい ズームトランジションがあります これはナビゲーションと プレゼンテーションの両方で機能します 見た目が新しいだけではありません 常にインタラクティブな操作が可能で トランジションの最初からでも 途中でも つかんでドラッグできます アプリ内で 大きなセルから トランジションする場合 ズームトランジションを使用すると トランジション全体で同じUI要素が 画面上に表示されるため アプリの連続性が高まります iOS 18ではSwiftUIとUIKitの 相互運用性が強化され アプリでそれらを簡単に交換して 使用できるようになりました
2つの領域のアップデートについて 説明します アニメーションと ジェスチャリコグナイザです まずは アニメーションに関する 非常にエキサイティングなアップデートです SwiftUIアニメーションタイプを使用して UIKitビューをアニメーション化できます これにより SwiftUIの CustomAnimationを含むすべての SwiftUIアニメーションタイプを使用して UIKitビューをアニメーション化できます さらに SwiftUIスプリングアニメーションを使って 滑らかなジェスチャで動くアニメーションを 簡単に作成できます
これを使用するには ジェスチャの変更時と終了時の両方で ビューをアニメーション化します これにより アニメーションの インタラクティブ部分と 非インタラクティブ部分にわたって 連続速度がシームレスに維持されます この素晴らしいアップデートの アニメーションの概要については Russellがわかりやすく解説している 「Enhance your UI animations and transitions」をご覧ください 通常 アニメーションは ジェスチャリコグナイザとペアになっていますが UIKitとSwiftUI間でジェスチャを 調整するのも簡単になりました ジェスチャシステムは UIKitとSwiftUIで統一され 一貫したルールに従うようになりました iOS 18では両方のフレームワークにわたって ジェスチャ間の依存関係を指定できます これはUIKit階層にネストされた SwiftUI階層の例です ここでUIKitのシングルタップジェスチャと SwiftUIのダブルタップジェスチャを 共存させたいとします
ここではジェスチャが同時に認識されます これを防ぐために これら2つのジェスチャリコグナイザの間に 処理の失敗要件を設定します まずSwiftUIジェスチャを設定するときに 名前を指定します 「SwiftUIDoubleTap」 次にUIKitデリゲート内で もう一方のジェスチャリコグナイザの 名前を確認して SwiftUIジェスチャに 関連付けられているものを特定します これで UIKitからのシングルタップ ジェスチャリコグナイザは SwiftUIダブルタップジェスチャが 失敗した場合にのみ起動し 目的の効果を達成します iOS 18では 既存のUIKitジェスチャリコグナイザを SwiftUI階層に直接 追加できるようになりました 新しい UIGestureRecognizerRepresentable プロトコルを使用します 「What's new in SwiftUI」 をご覧になり UIGestureRecognizerRepresentableを アプリに採用する方法を ご確認ください 最後に UIKitの一般的な 機能強化について説明します
UIKitの特性システムは アプリの階層内のビューコントローラと ビューにデータを送信します iOS 18では 特性の使用と変更の処理が これまで以上に簡単になりました UIKitはlayoutSubviewsや drawRectなどの 一般的なビューとビューコントローラの 更新メソッド内での自動特性トラッキングを サポートするようになりました これらのサポートされているメソッドの いずれかをUIKitが呼び出すと そのメソッド内でアクセスした 特性が記録されます その後 これらの特性の いずれかの値が変化すると UIKitは setNeedsLayoutや setNeedsDisplayなど そのメソッドに関連付けられた無効化処理を 自動的に実行します この例では layoutSubviewsをオーバーライドする UIViewサブクラスがあります ビューのtraitCollectionから horizontalSizeClass特性を読み取り 使用するレイアウトの種類を決定します 自動特性トラッキングが登場する前は horizontalSizeClass特性を手動で登録し 変更されるたびにこのビューで setNeedsLayoutを 呼び出す必要がありました iOS 18の 自動特性トラッキングを使用すると 手動による特性変更登録を 完全に削除できます これはlayoutSubviewsが呼び出されると horizontalSizeClass特性の使用が 記録されるためです
またこのビューの特性が変更されると setNeedsLayoutを自動的に受け取り 新しい値に更新します 自動特性トラッキングは 必要な特性依存関係のみを作成することで 最大のパフォーマンスを実現します この新機能は サポートされている 更新メソッド内で常に有効になっています
サポートされている全メソッドのリストは 関連ドキュメントを参照してください 次に コレクションとテーブルビューの APIが更新され より簡単に セルを更新できるようになりました UICollectionViewリストセクションと UITableViewのすべてのビューに リスト環境特性が設定されました
リスト環境は ビューが含まれる リストのスタイルを記述します この特性を使用し どのリストでもセルが適切に スタイル設定されていることを確認します UIListContentConfigurationと UIBackgroundConfigurationは この新しい特性を利用するようになりました
新しい状態に更新されると 構成状態の特性コレクションの リスト環境に合わせて プロパティが調整されます
そのため セルの構成時にリストの スタイルを特定する必要がありません
代わりに セルの構成コードは 表示されるコンテンツに必要なスタイルのみ すなわち 通常のセル ヘッダ フッタのスタイルだけを 知っていればよいのです 例として ファイルアプリのタブ について考えてみましょう ここではUICollectionViewと コンポジションレイアウトを使用し 場所 お気に入り タグのリストを コンテキストに応じて 2つの異なるスタイルで表示します 縦長モードでは ブラウズリストは insetGroupedの外観を使用します 横長モードでは 同じブラウズリストが Split View Controller のサイドバーに表示され UICollectionViewの コンポジションレイアウトを構成するときに サイドバーの外観が使用されます これはブラウズリスト内の場所の コンテンツとバックグラウンド 構成を生成する ファイルアプリの関数です iOS 17では この関数は このように実装されていました
ファイルの場所の構造体と リストの外観を引数として受け取ります まずリストの外観が サイドバースタイルかどうかを確認し その結果を ローカル変数isSidebarに格納します 次にisSidebar変数に基づいて コンテンツとバックグラウンド構成を 手動で選択します 構成は手動で作成されたため ブラウズリストの外観が変更されたときは それらを使用するセルを 手動で再構成する必要があります この関数は更新された外観に対して 再度実行されます
iOS 18では この関数を大幅に 簡素化できるようになりました ファイルアプリではコンテンツ構成に cellコンストラクタを使用し backgroundConfigurationに 新しいlistCellコンストラクタを使用します
構成がセルに適用されると セルの構成状態に応じて更新されます 新しいリスト環境特性は 構成状態の特性コレクションにあるため これらの構成は リストのスタイルに合わせて プロパティを自動的に 更新するようになりました UIListContentConfigurationの場合 既存のセル サブタイトルセル 値セルの構成が リスト環境特性から外観を 自動的に更新するようになりました
新しいヘッダとフッタの構成も同様です UIBackgroundConfigurationには 3つの新しいコンストラクタがあります listCell listHeader listFooterです
これらのバックグラウンド構成も リスト環境特性から外観を 自動的に更新します
これらの新しい追加機能をすべて活用して コードを簡素化してください
UIUpdateLinkはiOS 18の新機能で 定期的なUI更新を必要とする 複雑なアニメーションの実装が さらに簡単になります CADisplayLinkを使ったことがあれば UIUpdateLinkに馴染みがあるでしょう
自動ビュートラッキングなどの 機能が追加され ビューが表示されているディスプレイに 合わせてリンクが自動的に調整されるほか 描画アプリケーション用に システムをLow latencyモードにする 機能もあります さらに高度な機能を使用することで パフォーマンスとバッテリー効率を 向上させることができます これは正弦関数を使用して ビューを 上下にアニメーション化するコード例です UIUpdateLinkの作成時に UIViewのインスタンスを指定します ビューが表示ウインドウに追加されると UIUpdateLinkが自動的にアクティブになり ビューがウインドウから削除されると 非アクティブになります update関数では更新のタイミングに updateInfoのmodelTimeを使用します さらにrequiresContinousUpdatesを trueに設定して updateLinkが有効の間は 継続的に実行されるようにします falseの場合 ジェスチャやレイヤの変更など 他の何かが更新された時のみ updateLinkが実行されます 詳細情報と より高度なユースケースについては UIUpdateLinkのドキュメントページを ご覧ください SF Symbolsはツールバーアイコンや ナビゲーションバーなど UI要素の外観の 一貫性を保証します UIKitのSF Symbolsに新しい シンボルアニメーションが追加されました UIImageViewとUIBarButtonItemには 3つの新しいアニメーションプリセットがあります .wiggleエフェクトはシンボルを任意の 方向や角度に振動させて注目を集めます
.breatheエフェクトはシンボルをスムーズに 拡大または縮小して 進行中のアクティビティを示します .rotateエフェクトは指定したアンカーポイント の周りでシンボルの一部を回転させます 新しい.periodic動作により アプリは 繰り返し回数と 繰り返し間のカスタム遅延の 両方を指定できます 新しい.continuousオプションを使用すると アニメーション終了まで 特定の効果が シームレスに繰り返しアニメーション化されます また既存のプリセットの一部が 新しい機能で強化されました デフォルトの.replaceエフェクトでは バッジと スラッシュをスムーズにアニメーション化する 新しいマジック置換動作が 優先されるようになりました この動作は必要に応じて自動的に 標準の置換スタイルにフォールバックします 例えばマジック置換は マイクとビデオの シンボルではサポートされていないため フォールバックとしてDownUp置換スタイルが 自動的に使用されます フォールバックスタイルを明示的に 指定するための新しいAPIもあります この場合は.upUpスタイルです
シンボルのその他の新機能 例えば更新されたSF Symbolsアプリや 可変色のタイミングに関する新しい注釈 バウンスエフェクト用の追加動作などを 知りたい場合は 「What’s new in SF Symbols 6」を ご覧ください シンボル効果を取り入れる方法を 再確認するには 「Animate symbols in your app」を ご覧ください 感覚フィードバックはiPhoneアプリを 強化する素晴らしい方法です iPadOS 17.5では この機能が Apple Pencil ProとMagic Keyboardを 搭載したiPadに拡張されました UIFeedbackGeneratorは これらの新しいフィードバック提供方法を サポートしており インタラクションとして ビューにアタッチできます フィードバックを提供する際 アプリはフィードバックをトリガする アクションが発生した ビュー内の場所を渡す必要があります 新しい UICanvasFeedbackGeneratorもあります 大きな描画ビューやアートボードビューを 持つiPadアプリに最適です これらすべてがアプリ内でどのように まとめられるかについて説明します 図形をドラッグして グリッドにスナップしたとき フィードバックを提供する 図形描画アプリを考えてみましょう これはUICanvasFeedbackGeneratorの 素晴らしい使い方です フィードバックジェネレータが作成されたら それをビューに関連付けます
フィードバックがトリガされたら 場所を渡します この場合 ドラッグされた図形の 位置合わせをトリガしたのは ジェスチャリコグナイザからの場所です
これで Apple Pencil Proを使って図形を ドラッグし スナップガイドに合わせると Pencil Proが触覚フィードバックを 返すようになりました
フィードバックジェネレータの役割は 触覚だけではありません プラットフォームと設定に応じて 触覚とオーディオを個別に再生したり 両方とも有効または無効にしたりできます
アプリは期待される効果に関係なく すべてのプラットフォームで常に 同じジェネレータを使用する必要があります iOS 18では テキストの フォーマット機能が拡張されています 新しいテキストフォーマットパネルを 活用すると テキストフォーマットオプションを 提供するアプリで 一貫性のある カスタマイズ可能な体験を実現できます テキスト属性の編集を可能にする UITextViewには 新しい編集メニューアクションがあり デフォルトのオプションセットを含む 新しいフォーマットパネルが表示されます
テキストのフォーマットでは フォントやサイズの変更 リストの追加や他の属性の変更を 明確かつ簡単に行えます
フォーマットパネルは 新しい テキストハイライト機能にも対応します
これは2つの新しい属性を 適用することで機能します ハイライトするテキストの範囲を示す textHighlightStyleと ハイライトのレンダリングに 使用する色を表す textHighlightColorSchemeです
デフォルトに加えて 5つの定義済み配色があります デフォルトでは淡色を使います フォーマットパネルのコントロールと レイアウトをカスタマイズします それにはUITextViewの 新しいtextFormattingConfiguration プロパティを使用してカスタム UITextFormattingView Controller.Configurationを設定します このプロパティをnilに設定することで 新しい動作を無効にします パネルの表示を調整するには 新しい UITextFormattingViewControllerと そのデリゲートを使用します
Writing Toolsは 高度なテキスト編集ができる 優れた新機能です
UITextViewsにはデフォルトで Writing ToolsのUIが提供されます 編集可能なテキストビューには インライン編集のための完全な校正機能や 作文機能のサポートが提供され 編集不可能なテキストビューには オーバーレイパネルが表示されます UITextViewには このユーザーインターフェイス体験を 追跡および変更するための 追加のAPIがあります これにはデリゲート通知や 動作を制限するプロパティなどが含まれます メニューアクションは macOSのメニューバーに加え iPadOSとvisionOSの キーボードショートカットメニューにある アプリのすべのコマンドを提供します iOS 18では iPhone専用アプリで メニューアクションがより便利になります UICommand UIKeyCommand UIActionsを使用してアプリを準備し 他のシステム呼び出しをサポートします UICommands UIKeyCommands UIActionsは システムで呼び出して アプリを制御することができます 例えば アプリがiPhoneミラーリングを 介して使用される場合 UIKeyCommandsは Macキーボードから呼び出されます メインメニューシステムに コマンドを追加する方法については 「Take your iPad apps to the next level」をご覧ください ここでUIKitとPencilKitへの 追加について説明します Apple Pencil Proと描画体験を統合し 少ないコードで豊富なツール選択体験を 提供するためのものです iPadOS 17.5に新たに追加されたUIKitは Apple Pencil Proの素晴らしい新機能を すべてサポートしています スクイーズジェスチャを使用すると ツールをすばやく切り替えたり 必要に応じて ペンシルをホバーしている 位置にピッカーを表示したりできます Apple Pencil Proに合わせてフィードバック ジェネレータがアップデートされ 描画や手書きの体験が向上しました バレルロール角度を提供する UITouchと UIHoverGestureRecognizerにより アプリの描画ツールが さらに表現力豊かになります 取り消しをサポートするすべてのアプリでは Apple Pencil Proをスクイーズすると 取り消しスライダが表示され 取り消し履歴を簡単に操作できます iPadOS 18とvisionOS 2の新機能である PKToolPickerでは 利用可能なツールを定義できます PKToolPickerはPKCanvasViewや 独自の描画キャンバス またはその両方を組み合わせて 使うことができます カスタム描画キャンバスのツールを PKToolPickerに組み込むための 新しいAPIがあります Apple Pencil Proのサポートが 強化された今ほど PKToolPickerの導入に 適したタイミングはありません 新しいApple Pencil APIについて 詳しくは 「Squeeze the most out of Apple Pencil」をご覧ください 本当に沢山の改善点があります UIKitには様々な機能が備わっており 一層パワーアップしています 次のステップは iOS 18 SDKを使って アプリをコンパイルする UIKitの新しい機能を導入する トランジションやアニメーション タブバー 新しいドキュメント起動体験の 改善点を活用することです そしてUIKitとSwiftUIの両方を アプリに統合する新しい方法を 引き続き試してください ありがとうございました
-
-
0:01 - Using SwiftUI to animate UIViews with gestures
switch gesture.state { case .changed: UIView.animate(.interactiveSpring) { bead.center = gesture.translation } case .ended: UIView.animate(.spring) { bead.center = endOfBracelet } }
-
0:02 - Setting failure requirements between gestures
// Inner SwiftUI double tap gesture Circle() .gesture(doubleTap, name: "SwiftUIDoubleTap") // Outer UIKit single tap gesture func gestureRecognizer( _ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf other: UIGestureRecognizer ) -> Bool { other.name == "SwiftUIDoubleTap" }
-
0:03 - Responding to horizontalSizeClass trait
class MyView: UIView { override func layoutSubviews() { super.layoutSubviews() if traitCollection.horizontalSizeClass == .compact { // apply compact layout } else { // apply regular layout } } }
-
0:04 - Using the new automatic content and background configurations
func configurations(for location: FileLocation) -> (UIListContentConfiguration, UIBackgroundConfiguration) { var contentConfiguration = UIListContentConfiguration.cell() let backgroundConfiguration = UIBackgroundConfiguration.listCell() contentConfiguration.text = location.title contentConfiguration.image = location.thumbnailImage return (contentConfiguration, backgroundConfiguration) }
-
0:05 - Using UIUpdateLink
let updateLink = UIUpdateLink( view: view, actionTarget: self, selector: #selector(update) ) updateLink.requiresContinuousUpdates = true updateLink.isEnabled = true @objc func update(updateLink: UIUpdateLink, updateInfo: UIUpdateInfo) { view.center.y = sin(updateInfo.modelTime) * 100 + view.bounds.midY }
-
0:06 - An example of providing UICanvasFeedbackGenerator with additional context
@ViewLoading var feedbackGenerator: UICanvasFeedbackGenerator override func viewDidLoad() { super.viewDidLoad() feedbackGenerator = UICanvasFeedbackGenerator(view: view) } func dragAligned(_ sender: UIPanGestureRecognizer) { feedbackGenerator.alignmentOccurred(at: sender.location(in: view)) }
-
0:07 - Using new attributes for highlight
var attributes = [NSAttributedString.Key: Any]() // Highlight style attributes[.textHighlightStyle] = NSAttributedString.TextHighlightStyle.default // Highlight color scheme attributes[.textHighlightColorScheme] = NSAttributedString.TextHighlightColorScheme.default
-
0:08 - Customizing formatting panel
textView.textFormattingConfiguration = .init(groups: [ .group([ .component(.fontAttributes, .mini), .component(.fontPicker, .regular), .component(.textColor, .mini) ]), .group([ .component(.fontPointSize, .mini), .component(.listStyles, .regular), .component(.highlight, .mini) ]) ])
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。