ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
iPadOSのポインタの作成
Magic Keyboard、マウス、トラックパッド、またはその他の入力デバイスをiPadにつなげて使用される方が、お持ちのAppを最大限に活用できるようにしましょう。Pointer Interaction APIを使って、iPadのポインタのカスタマイゼーションを追加して、ボタンやカスタムビューをポインタと連動させ、特定のエリアでポインタの形状を変える方法を説明します。 iPad上でのポインタインタラクションについてさらに学んでいただき、このセッションを最大限に活用していただくために、“Design for the iPadOS pointer”および “Handle trackpad and mouse input”もご覧になることを推奨します。
リソース
関連ビデオ
WWDC23
WWDC21
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “iPadOSポインタ用ビルド” UIkitエンジニアのモハメドです あとでiOSシステムUIチームの ジョーイも参加します iPad OS ポインタの ビルド方法を説明します
iOS13.4からiPad向けのポインタの サポートが導入されました 発売開始以来タッチベースであったOSにとって 最新の入力メソッドになります Macに既存のインタラクションモデルを 取り込むのではなく ポインタを追加することで 得られるメリットと タッチベースの入力との共存方法を 考えてみました 答えはアダプティブポインタにあります 精度に合わせてコントロール上を ホバーするよう変形したり 選択しているコントロールを 明確に示したりします つまりコンテキストなヒントを与えるために ポインタの形や動きが変わるということです
例えば 文の上をホバーすると ポインタがI字型になったり 文章の先頭に戻ったりします この動画ではiPad OSの ポインタとアプリケーションを 同じ方法でアップデートする手順を紹介します
そしてiOS13.4に導入されたポインタを カスタマイズするAPIや アップデートに際して知っておくべき 実例も紹介します
ポインタのUIの基本的な デザインの原則にも触れます ポインタのデザインに関係する原則や 思考過程の詳細については デザインに関するセッションで確認してください
iPadにポインタデバイスをつなげれば アプリケーションがなくても 自動的にポインタ機能が使えるようになります すべてのシステムに ポインタサポートが内蔵されているからです UIBarButtonItemや UISegmentControl UIMenuController といったコントロールには ポインタのエフェクトや動作が 組み込まれています スクロールビューは 2本の指をマウスのように 動かすと反応します 画面を拡大することもできます
テーブルまたはコレクションビューでは パンするスワイプアクションも可能です UITextViewやUItextInteractionを使う 他のコンポーネントでは 一連のテキスト操作や ジェスチャーの編集もできます Macユーザーはよくご存じでしょう
UIDragInteractionは クリック&ドラッグで素早くドラックできます 画面をタッチして 長押しする必要はありません
UIContextMenuInteractionは 2回クリックすれば 新しくコンパクトなメニューを表示します
ポインタのアップデート法に入ります
トップダウン方式でお伝えします 優先度の高いAPIから始めます 洗練されたエクスペリエンスのために 他のシステムのUIと一貫するように 動作と見た目を調整します ポインタに関するAPIは スタックごとに存在しています コントロールの多くは ポインタエフェクトを内蔵しており バーのボタンのように デフォルトでエフェクトが利用できます UIButtonなどの場合は APIでエフェクトをカスタマイズできます
UIPointerInterractionは カスタムUIがポインタに反応し 相互作用できるように 他のシステムと一貫性を持たせます これを使えばシステムが提供するエフェクトから 最適なビューを適用できます アプリケーション内で ポインタの形を変えることも可能です UIHoverGestureRecognizerは ポインタの動きを直接反映します ホバーやハイライトの適用 またはポインタの形の修正の必要がない― カスタム動作に最適です ジェスチャーやイベントに追加する ポインタについての詳細は トラッドパッドやマウスポインタを 制御するセッションを確認してください アプリケーションをアップデートするのは OSとの一貫性があるエクスペリエンスを 求めているからでしょう どこにポインタサポートを加えるか決める際は Human Interface Guidelinesや 内蔵のアプリケーションを参考にしてください まずはコントロールに 適切なエフェクトがあるか確認しましょう クロームというアプリケーションの 上下にあるバーで 確認することができます
UIBarButtonItemsはSystmItemやimage もしくはtitleのAPIを使って作ります 適切なポインタエフェクトが自動的に使えます
カスタムビューのAPIを使うなら 自分で動作を実装する必要があるでしょう もしくはビューに役立つAPIを利用するか ポインタのインタラクションを インストールして管理します
カスタムビューAPIを通じて バーに設置したUIButtonには 元から有効なインタラクションが 組み込まれています またシステムがバーのボタンに 適切だと考えたエフェクトを設定します
UIbuttonの便利なAPIを使えば このエフェクトを微調整できます UIButtonにある2段階の 便利なAPIを使えば簡単です 自動的にエフェクトを有効するために button.isPointerInteractionEnableを trueにします そしてbutton.pointerStyleProviderを使って カスタマイズします
丸括弧内にあるのは システムが提案するエフェクトや形です それはボタンの見た目や大きさ コンテンツをもとに設定されてます
このいずれかをカスタマイズするか 完全に置き換えて 新しいスタイルを作り上げることができます
いくつか例を見る前に 少し脱線して ポインタのスタイルを説明します
APIを使ってポインタの見た目を修正するには UIPointerStyleに修正を書き込みます
スタイルには2種類あります
1つ目はコンテンツエフェクトです
コンテンツエフェクトはアプリケーションの 画面上でポインタを変形させ いくつかの視覚処理を適用します
バーボタンに適用する ハイライトのエフェクトがその例です ポインタが角丸長方形に変形したり ボタンの下に消えたり 微細なパララックスエフェクトを 適用したりします
ビューに適用された視覚処理を 記述するUIPointerEffectや ポインタの変形を記述する UIPointerShapeからスタイルが構成されます
このエフェクトを指定するためには UIPointerStyleに ハイライトや角丸長方形を ポインタの形として組み込みます
2つ目はシェイプカスタマイゼーションです UIPointerShapeや UIAxisマスクに記述します
適用するとポインタはその形に変更され アクティブな範囲内で 移動する方向を紐付けされます
このいい例がテキストのポインタの動作です shapeにはvertivalBeamを constrainedAxesにはverticalを記述します これでポインタがテキスト上を 水平に動くように見せます
コントロールのAPIや ポインタのスタイルの基本概念を 既存のアプリケーションに適用する方法を ジョーイに説明してもらいましょう ジョーイ?
了解です モハメド 私が使っているQuilt Simulatorという アプリケーションを紹介します このアプリケーションを開発して 私はキルト作りを学びました ここまでに学んだことを復習させてください
まずはじめに右下にあるボタンを見てください 簡単に真っすぐ縫えるように モードを切り替えてくれます ハイライトを使っているようですが エフェクトのサイズが合っていません Xcodeの画面に戻って修正してみましょう
既にポインタのインタラクションが 有効になっていて デフォルトのエフェクトが付与されています pointerStyleProviderを追加して 定規マークのボタンの形を直します
1文目のrectにボタンの適切な大きさと 座標を設定します
そのrectを提案されたエフェクトの 対象プレビューの空間座標に変換します
最後に提案されたエフェクトを使う スタイルに戻せば rectを基にポインタの形が改善されます 修正結果を見てみましょう
よくなってます ボタンが正しく表示されています
次に右上にある糸の選択ボタンを 見てみましょう このボタンは現在選択している 糸の色を変更できます
リフトエフェクトを使うために このバーボタンは既にカスタマイズしてあります 少しおかしい感じがします ポインタが近づくと ボタンの下がぼやけたように見えます これでは見づらいです Xcodeに戻ってこの問題を解決しましょう
UIBarButtonItemがあるので 既にエフェクトが設定されています pointerStyleProviderを 修正しますが 今回はデフォルトから リフトエフェクトに変更します これでは不十分なので形を正確にしましょう
新しく実装したUITargetedPreviewを リフトエフェクトの使用に合わせます ビューやターゲットまたは 上で作ったプレビューの値を作成しました
shadowPathプロパティのパラメーターには ボタンの外周に合うパスをセットします
最後に記述するのは リフトエフェクトを使ったポインタスタイルや ボタンに合うポインタの形です
iPadに戻って確認してみましょう
よくなっています ポインタを近づけると 糸巻きのアイコンがはっきりしています
モハメドに話を戻します
ありがとう ジョーイ 今度はカスタムUIについて話しましょう
カスタムUIにポインタの動作を付け加えるなら ユーティリティーやユニークな値を 加えることに重点を置いてください
Quilt Simulatorアプリケーションでは 画面中央に広いエリアがあります 縫い始めと終わりを クリックすれば縫い目ができます カスタムのポインタ動作を利用して エクスペリエンスを向上することができます 機能を2つ拡張してみましょう まずはキルトのエリアをホバーする時の ポインタの形を変えます これは縫い始める場所を確認するためです
キルト初心者のためにガイドモードを追加して ポインタが垂直な軸に沿うようにします 縫い目を水平に保つことが簡単にできます
これはすべてカスタムビューなので UIPointerInteractionを直接使います 他のUIinteractionでUIPointerInteractionの インスタンスを作りビューに追加します しかし他と違って インタラクションのデリゲートは任意です
ポインタに適用したいエフェクトや 形の変更を指定するには UIPointerStylesを使います スタイルがアクティブになる箇所を 厳密に制御したいなら UIPointerRegionsも定義します 指定したスタイルを インタラクションに示すためです
デフォルトでインタラクションは 全体のビューをカバーしています
スタイルをデリゲートしていなくても インタラクションは自動的にポインタの エフェクトを全体のビューに適用します
これは単純なケースではとても便利です エフェクトをビューに適用させる場合や エフェクトが関係ない場合です しかし我々のシナリオはもっと専門的です
画面の特定の小さな範囲内での 動作を定義したいので UIPointerInteractionDelegateの regionFor requestメソッドを実装します
このメソッドで新しい範囲を要求するのは インタラクションのビュー内で ポインタを移動する時です 実装するためにはガイドに対応する範囲で ポインタが動作するようにします
ポインタがある範囲に入ったら インタラクションはスタイルを要求するために styleForRegionメソッドを呼び出します メソッドを実装して十字の形になるように シェイプカスタマイゼーションを設定します
ではジョーイにその方法を 実践してもらいましょう
モハメド 了解です ここでもQuilt Simulatorを 使って解説します まずは糸の色を選びキルトを縫い始めます パッチワークエリアで 縫いたい場所をクリックするだけです まずは黄色の糸を選びます
UIScrollViewの機能を利用すると 2本の指で拡大できます
そして何針か縫ってみます
カスタムでポインタの形を指定して 精度の高いレーザーを利用すれば カスタムした範囲でユーザーを 効率的にアシストできます
まずはカスタムしたポインタの インタラクションをビューに追加します
新しいUIPointerInteractionを作って キルトの画面で動くように追加します
styleFor Regionの デリゲートメソッドは実装済みです 初めの構文はhelperメソッドから取得した カスタムのBezier pathを設定し
2つ目の構文はポインタの形を指定する UIPointerStyleを設定します さて見てみましょう
とてもよくなりました 上質な糸のような自然な縫い目です では前に話した直線モードに戻りましょう 定規ボタンをクリックして有効にします
そして何針か縫います
とても簡単に すばらしい縫い目ができました しかしばらつきがあります ポインタは自由に動かせますが 縫い目は目盛りの上にだけ表示されています
対処法を説明しましょう
デリゲートメソッドを修正して ポインタが垂直に動くようにしているので ポインタはそれぞれの行に結びついています まずregionFor Requestの実装を追加して ガイドラインごとに違う範囲を指定します
StraightLineStitchモードを使うと グリッド線を別の範囲に指定できます
それ以外はデフォルトの範囲になります
次にポインタの動きを垂直な軸に合わせます
ガイドを使えば 十字キーは垂直に動くようになります それ以外は前と同じ動きです
真っすぐ縫うために アプリケーションの機能を拡張しました ポインタを適当に動かしても垂直になる ガイドラインに従います どこにカーソルを進ませても 磁石のように戻ってきます これでデモは終了です モハメド
ありがとう ジョーイ ポインタエクスペエンスを 仕上げるためのステップを紹介します
ポインタエクスペリエンスを より良くするための方法がいくつかあります 1つはビューの周りに余白を指定することです ポインタの戻る力を増強して UIで重要な要素に作用しやすくなり― ボタンの端にたどり着く前に ポインタはボタンに戻ります
これはポインタスタイルの効果が及ぶ エリアを拡大した結果です
指定する範囲にも制限があります インタラクションのビューにある hittestable内でなければなりません ビューより大きな範囲にしたいなら ビューにヒットテストされていることを 確認しなければなりません
ポインタの範囲を調整すれば エフェクトが変化する具合を制御できます リマインダーを例にしてみましょう ビューの見た目は分かれていますが ビュー間のポインタの移行は滑らかで 隙間でシステムのシェイプに 戻ることはありません
隣接したポインタの範囲に インタラクションを付与しているおかげです
複数のポインタの範囲やスタイルを調整する時 インタラクションをビューヒエラルキーの 一番上に置くのには意味があるのです UIの見た目を完璧に近づけ 全体を論理的に考えることができます
この例ではインタラクションを 全体のビューに付与し デリゲートは 別のサブビューの範囲に指定しました
さらにポインタのインタラクションに アニメーションを追加することもできます こうすれば役に立つ情報が提示できて エフェクト中のクラッタを減らすことができます
UISegmentedControlで ポインタのセグメント間の移動を スムーズにする方法をお見せします
アニメーションを調整するためには デリゲートにwillEnterや willExit regionを実装し animatorオブジェクトに アニメーションに付与します
この例ではポインタが範囲にきたら 区切り線のビューをフェードアウトして 範囲から出たらフェードバックします
詳しくはHuman Interface Guidelinesや 開発者向けドキュメントを参照してください この映像に関係するサンプルも確認してください 試す価値のあるいい例があります
最上級のポインタエクスペリエンスを持つ iPadアプリケーションをビルドしてください 古典的な分野にこそ 高度なAPIを使うべきです コントロールやカスタムUIに 反応の良いポインタエフェクトを加えてください 最後に実装を洗練するために 少し手を加えてみてください そしてUIに驚きと喜びを与えてください
ポインタを活用した アプリケーションの開発に期待しています
-
-
6:04 - UIButton Pointer Effects
// Enable the button's built-in pointer interaction. myButton.isPointerInteractionEnabled = true // Customize the default interaction effect. myButton.pointerStyleProvider = { button, proposedEffect, proposedShape -> UIPointerStyle? in // In this example, we'll switch to using the .lift effect by creating a new // UIPointerEffect with the .lift type using the proposedEffect's preview. return UIPointerStyle(effect: .lift(proposedEffect.preview), shape: proposedShape) }
-
7:05 - Pointer Content Effect
// Create a UIPointerStyle that applies the .highlight effect. // Outset the view's frame so the pointer shape has some generous padding around the view's contents. // Note that this frame must be in the provided UITargetedPreview's container's coordinate space. // In the majority of cases (where the preview doesn't have a custom container), this is just the view's superview. let rect = myView.frame.insetBy(dx: -8.0, dy: -4.0) let preview = UITargetedPreview(view: myView) return UIPointerStyle(effect: .highlight(preview), shape: .roundedRect(rect))
-
8:02 - Pointer Shape Customization
// Create a UIPointerStyle that changes the pointer into a vertical beam. let beamLength = myFont.lineHeight return UIPointerStyle(shape: .verticalBeam(length: beamLength), constrainedAxes: .vertical)
-
21:31 - UIPointerInteraction Region Entrance Animation
func pointerInteraction(_ interaction: UIPointerInteraction, willEnter region: UIPointerRegion, animator: UIPointerInteractionAnimating) { // Fade out separator when entering region. animator.addAnimations { self.separatorView.alpha = 0.0 } }
-
21:51 - UIPointerInteraction Region Exit Animation
func pointerInteraction(_ interaction: UIPointerInteraction, willExit region: UIPointerRegion, animator: UIPointerInteractionAnimating) { // Fade separator back in when exiting region. animator.addAnimations { self.separatorView.alpha = 1.0 } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。