ハイライト
iOS 14 では、UIKit のページ コントロール、カラー ピッカー、日付ピッカー、メニュー、UIAction に新しいシステム レベルの動作が導入され、開発者は既製のコントロールを使用して色の選択、コンパクトな日付入力、非同期メニュー、および統合イベント コールバックを処理できるようになります。
主要内容
このセッションは、非常に一般的なインターフェイスの問題を解決します。アプリには小さなインタラクションが多数あり、開発者自身がそれに取り組むことがよくあります。ページング インジケーターは多くのページをサポートする必要があり、色の選択はスポイトとお気に入りの色をサポートする必要があり、日付入力はフォームに挿入する必要があり、一連のコンテキスト アクションをボタンの横にハングする必要があります。これらの機能を自分で実行する場合、インタラクションの詳細、アクセシビリティ、ポインタ入力、および Catalyst の外観を見逃しがちです。 (00:24)
Apple は、これらのインタラクションを iOS 14 の UIKit コントロールに組み込みました。 UIPageControl 固定幅内の無制限のページとカスタム インジケーター画像をサポートします。 UIColorPickerViewController カラー グリッド、スペクトル、RGB、16 進数、コレクション カラー、スポイトを担当します。 UIDatePicker コンパクトなインライン スタイルが追加され、フォームと大きな画面の両方で同じ API セットを使用できます。 (03:20)
後半ではメニューとアクションに焦点が当てられます。 iOS14でできること UIMenu 直接取り付けられる UIButton そして UIBarButtonItemを長押しまたはタッチすると開きます。 UIDeferredMenuElement メニュー項目を非同期的に生成できます。 updateVisibleMenu 表示されているメニューを更新できます。 UIAction ボタン、バー ボタン項目、およびセグメント化されたコントロールのイベント処理をコントロールが作成される場所に配置し、散在するターゲット アクション コードを削減します。 (11:15)
これらの機能は iPad および Mac Catalyst にも役立ちます。講演の中で何度も言及されたのは、最適化された Catalyst アプリでは標準コントロールが macOS に近い外観を採用するということです。日付ピッカーのコンパクトなスタイルは、ポインター入力にも適しています。開発者が作成するカスタム コントロールの量が減り、アプリはシステム プラットフォームの違いに容易に対応できるようになります。 (01:38)
詳細
ページ コントロールは、固定スペースでより多くのページをホストできます
(04:34) 新しい外観 UIPageControl コントロールが固定サイズ内の任意の数のページをサポートできるようにします。スペースが不十分な場合、ユーザーはページポイント間をスクラブしたりスクロールしたりできます。また、ブックマーク ページやコレクション ページなどの特別な意味を持つページに適した、インジケーターの画像と背景スタイルのカスタマイズも追加されます。
let pageControl = UIPageControl()
pageControl.numberOfPages = 5
pageControl.backgroundStyle = .prominent
pageControl.preferredIndicatorImage =
UIImage(systemName: "bookmark.fill")
pageControl.setIndicatorImage(
UIImage(systemName: "heart.fill"), forPage: 0)
キーポイント:
numberOfPagesは引き続き元の API を使用しており、移行コストは低くなっています。backgroundStyle = .prominent背景領域を継続的に表示できるため、ページ コントロールをメイン コントロールとして使用するインターフェイスに適しています。preferredIndicatorImageすべてのページのデフォルト画像を設定します。setIndicatorImage(_:forPage:)特定のページに別のアイコンを設定できます。スピーチでは、0 ページにハートの形を使用して収集を示します。
カラーピッカーは完全な色選択プロセスを担当します
(06:56) UIColorPickerViewController シートまたはポップオーバーとして表示できるビュー コントローラーです。ユーザーは、グリッド、スペクトル、RGB、16 進値から色を選択したり、頻繁に使用する色を保存したりできます。 iPadOS のスポイトは画面上のどこからでも色を選択でき、Mac Catalyst では標準の macOS カラー パネルが使用されます。
var color = UIColor.blue
var colorPicker = UIColorPickerViewController()
func pickColor() {
colorPicker.supportsAlpha = true
colorPicker.selectedColor = color
self.present(colorPicker,
animated: true,
completion: nil)
}
func colorPickerViewControllerDidSelectColor(_
viewController: UIColorPickerViewController) {
color = viewController.selectedColor
}
func colorPickerViewControllerDidFinish(_
viewController: UIColorPickerViewController) {
// Do nothing
}
キーポイント:
supportsAlpha透明性を許可するかどうかを制御します。selectedColor表示する前に現在の色を書き込み、ユーザーはそれを開いた後に既存の値を確認できます。presentシステムのカラーピッカーを表示する役割を果たします。アプリ自体でスポイトやコレクションの色を実装する必要はありません。colorPickerViewControllerDidSelectColor読むselectedColorユーザーが色を選択した後。- ユーザーのキャンセルを処理する必要はありません。の
DidFinish講義の例では、空の実装を明示的に選択しました。
日付ピッカーは同じ API を使用してコンパクト スタイルとインライン スタイルを切り替えます
(10:04) UIDatePicker iOS 14 および iPadOS 14 では、コンパクトなスタイルが追加されました。日付と時刻がフィールドとして表示され、日付をクリックするとカレンダーが開き、時刻をクリックするとキーボード入力が開きます。表形式またはフォームでのコンパクトなレイアウトに適しています。インライン スタイルは、日付の選択がインターフェイスの主なタスクであるシナリオに適しています。講演では、新しいスタイルによって基礎となる API が変更されないことが強調されています。 UIDatePicker。
let datePicker = UIDatePicker()
datePicker.date = Date(timeIntervalSinceReferenceDate:
timeInterval)
datePicker.preferredDatePickerStyle = .compact
datePicker.calendar = Calendar(identifier: .japanese)
datePicker.datePickerMode = .date
datePicker.addTarget(self,
action: #selector(dateSet),
for: .valueChanged)
キーポイント:
dateは、引き続き元の方法を使用して初期値を設定します。preferredDatePickerStyle = .compact表示が変わるだけです。calendarを和暦などの暦法に変更すると、対応した内容が新しいスタイルで表示されます。datePickerMode = .date選択を日付に制限し、無関係な時間入力を非表示にします。addTarget(_:action:for:)まだそれをとして扱いますUIControl値の変更をリッスンします。
メニューは非同期的に生成したり、表示されているコンテンツを更新したりできます。
(14:20) iOS 14 では次のことが可能です UIButton そして UIBarButtonItem サポートする menu 直接。デフォルトでは長押しするとメニューが表示されます。 UIButton タッチするとすぐに表示できます showsMenuAsPrimaryAction; UIBarButtonItem メニューがあり、主要なアクションがない場合は、タッチ時にも表示されます。複雑なメニューは、次を使用して遅延生成できます。 UIDeferredMenuElement。
button.menu = UIMenu(title: "", children: [
UIMenu(title: "", options: .displayInline, children: (1...2).map { UIAction(title: "Static Item \($0)") { action in }}),
UIDeferredMenuElement({ completion in
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
completion([UIMenu(title: "", options: .displayInline, children: (1...2).map { UIAction(title: "Dynamic Item \($0)") { action in }})])
}
}),
])
キーポイント:
button.menuメニューをボタンに直接ハングし、UIKit がメニューを表示します。- 最初
UIMenu静的なアイテムを保持します。options: .displayInlineインラインで表示させます。 - の閉鎖
UIDeferredMenuElement電話をかけるcompletion非同期で、メニュー項目を追加する前にデータの準備ができるのを待つのに適しています。 - UIKit は待機期間中に標準の読み込み UI を表示し、生成されたアイテムを後続の表示でキャッシュします。
(14:50) 開いているメニューも更新できます。 updateVisibleMenu の UIContextMenuInteraction 現在のメニューのコピーを渡し、現在の表示コンテンツを置き換える新しいメニューを返します。
self.contextMenuInteraction.updateVisibleMenu { currentMenu -> UIMenu in
currentMenu.children.forEach { element in
guard let action = element as? UIAction else { return }
action.state = Bool.random() ? .off : .on
action.attributes = Bool.random() ? [.hidden] : []
}
return currentMenu
}
キーポイント:
updateVisibleMenuユーザーに表示されているメニューのみを処理します。currentMenu.children現在のメニュー項目を移動できます。- 例は更新のみです
UIAction、その他のメニュー要素は直接スキップされます。 state選択状態を切り替えることができます。attributesアイテムを非表示にすることができます。UIMenuiOS 14 では、子を不変にすることは強制されなくなったので、受信メニューを更新して直接戻ることができます。
UIAction はイベント処理をコントロール作成サイトに戻します
(16:05) UIAction iOS 13 で導入され、iOS 14 ではさらに多くのコントロールに拡張されました。 UIBarButtonItem 新しいイニシャライザを追加します。これにより、アクションを実行するだけのボタン、メニューを表示するだけのボタン、またはタップ アクションと長押しメニューの両方をサポートするボタンを作成できます。
let saveAction = UIAction(title: "") { action in }
let saveMenu = UIMenu(title: "", children: [
UIAction(title: "Copy", image: UIImage(systemName: "doc.on.doc")) { action in },
UIAction(title: "Rename", image: UIImage(systemName: "pencil")) { action in },
UIAction(title: "Duplicate", image: UIImage(systemName: "plus.square.on.square")) { action in },
UIAction(title: "Move", image: UIImage(systemName: "folder")) { action in },
])
let optionsImage = UIImage(systemName: "ellipsis.circle")
let optionsMenu = UIMenu(title: "", children: [
UIAction(title: "Info", image: UIImage(systemName: "info.circle")) { action in },
UIAction(title: "Share", image: UIImage(systemName: "square.and.arrow.up")) { action in },
UIAction(title: "Collaborate", image: UIImage(systemName: "person.crop.circle.badge.plus")) { action in },
])
let revertAction = UIAction(title: "Revert") { action in }
self.toolbarItems = [
UIBarButtonItem(systemItem: .save, primaryAction: saveAction, menu: saveMenu),
.fixedSpace(width:20.0),
UIBarButtonItem(image: optionsImage, menu: optionsMenu),
.flexibleSpace(),
UIBarButtonItem(primaryAction: revertAction),
]
キーポイント:
primaryActionクリックを処理し、menuより多くのアクションを処理します。UIActionメニュー項目としても、バー ボタン項目のメイン アクションとしても使用できます。- 画像とメニューがあるが主なアクションがないバー ボタン項目は、タッチするとメニューが表示されます。
.fixedSpace(width:)そして.flexibleSpace()は、スピーチで示された新しいツールバー項目の構成方法です。- 同じツールバーで、保存、その他のオプション、および元に戻す操作を混在させることができます。
(17:41) UISegmentedControl によって作成されたセグメントもサポートします UIAction。各セグメントのハンドラーは設定された位置の近くにあり、ユーザーがセグメントを選択すると、対応するアクションのみが呼び出されます。講演では、ケースが追加されたときに構成と応答ロジックが一緒に更新されるように、列挙型を使用してアクションを生成することを提案しました。
重要ポイント
-
ブランドカラーをサポートするエディター設定ページを作成します: を使用します
UIColorPickerViewControllerユーザーがテーマの色を選択できるようにします。すでにグリッド、スペクトル、RGB、16 進数、コレクション カラー、スポイトを処理しています。実装のエントリ ポイントは、ピッカーを表示することです。selectedColorをクリックし、選択内容をデリゲート コールバックに保存します。 -
フォームの日付フィールドを再加工: スペースを消費するスクロール ホイールを次のように変更します。
UIDatePickerコンパクトなスタイル。テーブルビューまたは複数フィールドのフォームに適しています。実装エントリは設定することですpreferredDatePickerStyle = .compact、そして使用しますdatePickerMode日付または時刻のみの選択を制限します。 -
長押しメニューをツールバー ボタンに追加: 保存、詳細、共有などのボタンには、主要なアクションとメニューを同時に含めることができます。実装エントリは使用します
UIBarButtonItem(systemItem:primaryAction:menu:)またはUIBarButtonItem(image:menu:)共通アクションと拡張アクションを整理します。 -
ネットワーク データを必要とするメニューを遅延読み込みに変更します: フォルダー、プロジェクト リスト、コラボレーター リストなどのメニュー項目は、次を使用して生成できます。
UIDeferredMenuElement。ユーザーがメニューを開いた後、最初にシステムの読み込み UI が表示されます。データ返却後、completionメニューを設定するために呼び出されます。 -
セグメント化された制御オプションと処理ロジックを統合: を使用します。
UIAction各セグメントを作成し、使用を避けるにはselectedSegmentIndexスイッチを書きます。エントリ ポイントは、列挙型を使用して一連のアクションを生成し、それらを新しいイニシャライザに渡すことです。UISegmentedControl。
関連セッション
- iOS ピッカー、メニュー、アクションを使用したデザイン — このデザイン サポート セッションでは、ピッカー、メニュー、アクションを使用するシナリオについて説明します。
- Mac Catalyst アプリのインターフェイスを最適化する - このセッションでは、Catalyst の外観とメニューについて何度も言及しました。 Mac 側のインターフェース適応をどのように処理できるかを続けて見てみましょう。
- iPadOS ポインター用にビルド - 日付ピッカーと標準コントロールは、iPad でのポインター入力を考慮する必要があります。このセッションでは、ポインター インタラクションの設計と API について説明します。
- トラックパッドとマウス入力の処理 - アプリが iPad または Mac Catalyst ユーザーを対象としている場合、このセッションではトラックパッド、マウス、スクロール、ジェスチャの処理が追加されます。
コメント
GitHub Issues · utterances