UIKitのアップデート #WWDC22
What's new in UIKitとその周辺情報を調べた結果をまとめておきます。
※すべて公開情報を元に書いています。
ナビゲーションバー
browser
とeditor
という2つの新しいナビゲーションスタイルが導入された。
browser
は履歴やフォルダ構造を使用するアプリに適している。editor
はドキュメントの編集がメインのアプリに適している。
iOS 16ではボタン要素をバーの中央に置くことができる。これによってユーザは多くのオプションが見られる。ドラッグアンドドロップでツールバーのカスタマイズもできる。
窮屈なときは自動でアイテムが収納される。
タイトルにもメニューアイテムを追加することができる。
関連リンク:
検索と置換
UITextView
、WKWebView
、PDFView
などはisFindInteractionEnabled
フラグを設定するだけで検索/置換機能を使うことができる。
UIFindInteraction
を使うと検索/置換文字列を入力するためのパネルが表示される。上述以外のviewでも、自分で一定の実装をすることで検索/置換機能を使うことができる(下記ドキュメント参照)。
関連リンク:
編集メニュー
編集時のメニューがよりインタラクティブになる。アクションを表示するメニューのプレゼンテーションスタイルは、インタラクションの入力方法に従う。タッチインタラクションの場合は編集メニューで表示される。ポインタベースの入力を持つデバイスで、セカンダリクリックに反応する場合はコンテキストメニューで表示される。
UITextView
、UITextField
などの標準的なUIKitクラスは、編集メニューインタラクションが使えるようあらかじめ設定されている。一般的なviewで使いたい場合は下記リンク先のようなコードを書けば良い。
UIMenuController
はiOS 16でdeprecatedになり、代わりにUIEditMenuInteraction
を使うことが推奨されている。
関連リンク:
サイドバー
追加コードなしでサイドバーを取り入れることができる。
カレンダー
新しくUICalendarViewが登場した。
以下のような機能が備わっている。
- 単一、もしくは複数の日付を選択
-
selectionBehavior
で単一選択か複数選択を決定できる。複数の場合はUICalendarSelectionMultiDateDelegate
で、単一の場合はUICalendarSelectionSingleDateDelegate
でハンドリングする。
-
- 選択可能な日付範囲の制限
-
availableDateRange
を使って設定する
-
- 特定の日付を選択から除外
-
dateSelection:canSelectDate:
メソッドでfalse
を返す
-
- 特定の日付に装飾
-
UICalendarViewDelegate
のcalendarView(_:decorationFor:)
を実装し、UICalendarView.Decoration
を使って様々な装飾を加えることができる。
-
使用したいカレンダーは明示しておく必要があることに注意する(Calendar(identifier: .gregorian)
の部分)。
UICalendarView
とUIDatePicker
の大きな違いは、UICalendarView
は日付をNSDateComponents
で表現していて、UIDatePicker
はNSDate
で表現していること。また、装飾ができるか否かの違いもある。
関連リンク:
ページコントロール
選択されているページとそうでないページで異なる画像を設定できるようになった。
ページコントロールの向きを設定できるようになった。
関連リンク:
ペースト
今まではコピペ時にトーストのようなバナーが表示されていたが、iOS 16からはペーストボードの使用許可を求めるアラートが表示されるように。
UIPasteControl
を使えばアラート表示を回避することができる。
関連リンク:
カスタムサイズのシート
任意のサイズのシートが作成できるようになった。この機能を利用するには.custom
detentを使用して、高さかパーセンテージを指定する。
.custom
detentに識別子を与えて管理することもできる。
customブロックから返される値は、フローティングシート(iPadなど)とエッジアタッチシート(iPhoneなど)の両方で同じ計算が機能するようにするため、下部のSafeAreaは考慮されていない。
関連リンク:
SF Symbols
monochrome
, multicolor
, hierarchical
, palette
の4つのレンダリングモードをサポート。iOS 15まではmonochrome
がデフォルトだったが、iOS 16からはhierarchical
がデフォルトになる。 UIImage.SymbolConfiguration.preferringMonochrome()
を使えばモノクロレンダリングできる。
シンボルによっては0〜1の値でバリエーションを表現できるようになった。speaker.3.wave.fillの例は以下の通り。
今までのSF Symbols APIで取得したUIImageにvariableValue
パラメータを追加すれば使うことができる。
関連リンク:
UIScreen
UIScreen.main
がdeprecatedに。UITraitCollection
、UIScene
APIなどの具体的なAPIを使うようにする。
関連リンク:
セルのセルフリサイジング
iOS 16では表示されているセル内のコンテンツが更新されると、そのコンテンツに合わせてセルが自動的にリサイズされる。UIListContentConfiguration
を使っている場合はselfSizingInvalidation
はデフォルトで有効になっている。
UIListContentConfiguration
を使ってセルを構成している以外のケースでは、セルまたはcontentViewに対してinvalidateIntrinsicContentSize
メソッドを呼び出してセルのサイズを変更することができる。
デフォルトではアニメーション付きでリサイズされるが、UIView.performWithoutAnimation
ブロックの中でinvalidateIntrinsicContentSize
を呼び出せばアニメーションを無効にできる。
セルにAuto Layoutを使用している場合は、enabledIncludingConstraints
を使うと良い。contentView
内でAuto Layoutの変更を検知すると、自動的にinvalidateIntrinsicContentSize
を呼び出して必要に応じてサイズ変更をしてくれる。
関連リンク:
- selfSizingInvalidation
- invalidateIntrinsicContentSize()
- UICollectionView.SelfSizingInvalidation.enabledIncludingConstraints
UIKitとSwiftUI
同じアプリに両方のフレームワークを組み込むことがより簡単になった。UIHostingConfiguration
を使えばセルの内部でSwiftUIを書くことができる。
関連リンク:
UIDevice
UIDevice.name
はユーザが設定したデバイス名ではなく、モデル名を返すようになった。取得したい場合はentitlementを使う。
UIDevice.orientation
はサポートされなくなった。代わりにpreferredInterfaceOrientation
などを使用して向きを表現する。
関連リンク:
Discussion