ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
iPad用Scribbleの紹介
Scribbleは、Apple Pencilを使って、iPadにテキストを入力するための軽量でかつ人間工学に基づいた、楽しい方法を提供します。標準のテキスト入力コントロールを使用したり、カスタムのテキスト編集エクスペリエンスを実装したりするAppで、Scribble と手書きテキストをどのように活用できるかをご紹介します。Scribble が TextKit とどのように統合されているか、また、新しい UIScribbleInteraction API と UIIndirectScribbleInteraction API を使って、App内で Scribble を楽しく一貫した体験を提供する必要があるケースについても学びます。 このセッションで多くのことを学んでいただくためには、UIKitテキスト入力コントロール、およびキーボード入力技術についての知識が必要です。“Keyboard Input in iOS”をご覧ください。カスタマイズされたテキストエディターを作成されている場合、UITextInputプロトコル、TextKit、またそれに関連するテキスト入力のAPIの知識が必要です。詳細は“TextKit Best Practices”および“The Keys to a Better Text Input Experience”をご覧ください。ペンシルを使った交流に関するデザインの手引きについては、“Apple Pencil Design Essentials”をご確認ください。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCにようこそ “iPad用 Scribbleの紹介” こんにちは “iPad用 Scribbleの紹介”にようこそ ダニエル・ゴベラです 私はPencil and Paperチームのエンジニアです 後から同僚のエヴァン・ロングが加わります ScribbleはiPadでテキストを入力する 画期的な新しい方法で― 手書き文字認識を通じて Apple Pencilを使います この動画では Scribbleが どのように 動作するのか概要を見ていきます すばらしいライティング体験を 生み出す側面を見ていきます ScribbleをサポートするAPIを 一通り説明した後 Scribbleの動作をカスタマイズする方法の例を 最後にいくつか紹介します アプリケーションの中で すばらしい体験が得られます iPadにScribbleを導入するとき 画期的なものとなるように目指しました Apple Pencilを中心として― Scribbleは システムに 完全に統合されます つまり個別の書き込みエリアではなく どんなテキストフィールドにも 直接 書き込むことができます 書いていくと自動的に入力されます 特別なモードはなく タップすることもなく ただ書くだけです iPadOS上のScribbleは システム体験の一部です つまりScribbleは キーボードと同じように 全てのアプリケーションから― デフォルトで利用できます テキストを入力できる場所なら どこでも機能します 最高クラスの手書き文字認識エンジンの上に 構築されているので エンジンは高速で非常に精度が高く 完全にデバイス上で実行されます このため常に利用でき 完全にプライベートです
エンジンが認識する手書きは― 英語 簡体字中国語 繁体字中国語 広東語です では すばらしいライティング体験を 生み出す側面の概要を見ていきましょう アプリケーションでScribbleによる すばらしい体験が実現するように 使うことのできるガイドラインを お見せします
最初の重要な側面は― Scribbleによってテキスト入力が自在で 楽に感じられることです マップ内で検索する例を見てみます 最初にフィールドをタップすることなく 直接 書き始められることに注目してください もし アプリケーションの中に Scribbleによる直接の書き込みを受け付けず― 最初にタップが必要なフィールドがある場合 もう少し後でお見せするAPIを使うべきです Scribbleは“ダイレクト” つまりテキストを挿入すべき位置は Pencilの位置によって システムに伝えられます Safariで複数のフィールドがあるフォームに 記入する例を見てみます フィールド間で 簡単にジャンプする方法にも 注目してください ストロークは消えていき― 書くにつれて自動的に入力されます Motionでディクテイトしているような感覚です
2つ目の設計原理は“一貫性”です Scribbleは テキストを入力したい あらゆる場所で機能する必要があります リマインダでの例を見てみます リストの各項目には 普通に 編集できるテキストが含まれます 当然 どのフィールドからも 書き始められます 人によっては 新しいエントリを 作成するのに― リストの下の空白エリアに書くことが 自然であると感じます そこは 通常ではテキスト入力ビューではなく このためReminderでは このエリアに書けるように 少し後で説明するAPIを採用しています これにより 新しいリマインダを簡単に追加する 新たなすばらしい方法が生まれました 編集ジェスチャの小さなセットもあり ジェスチャは一度覚えればよいものです Scribbleでテキストを編集できる場所なら ジェスチャはどこでも同じように機能します Eメールを作成するときの例を見てみましょう 水平線を引いてテキストを選択し 普通のテキスト編集操作を実行できます 削除したいテキストを消すこともできます これらにより 信頼できてなじみのある インタラクションモデルとなるのです 3つ目の設計原理は “Pencilの使いやすさ”です iOSユーザインタフェースは 主としてTouch用に設計されており Pencilの入力に非常にうまく機能します ただし調整した点が いくつかあることに気が付きます そのいくつかを説明します 第一に “書くこと”に集中できます テキストフィールドの プレースホルダーが良い例です プレースホルダーのあるフィールドに 書き始めと― ストロークと重ならないように プレースホルダーが消えて 手書き文字が読めるように保たれます この動作はStandard Text Controlsによって 無料で得られます
“安定的なレイアウト”とは 書いている間にテキストフィールドと― その中のテキストが移動したり スクロールしないことです 例えば検索フィールドによっては フォーカスされると 位置が移動することがあります これはキーボードの場合には重要ですが Pencilで書き込もうとするときには 問題となり得ます
このためScribbleは― 移動する検索フィールドに 書いていることを検出すると 書き込みが一段落するのを待ってから フィールドをファーストレスポンダにして テキストを挿入します 標準の検索コントローラを使えば この動作は無料で得られます ただし同様のシフトアニメーションのある カスタムフィールドがある場合 そのことをScribbleに伝える必要があり フィールドのフォーカスを 遅らせるように要求して 同じ動作を得ることができます
書き込むスペースが 常に 十分にあることも重要です Messagesアプリケーションが良い例です メッセージフィールドが 画面の隅にあることに気づきます 数ワード以上を書くための 大きなスペースはありません
このためMessagesは Scribbleが使われていることを検出し フィールドの大きさを調整するため 長いセンテンスでも余裕をもって 書くことができます
特にメッセージングアプリケーションなど 多くのものは同様のレイアウトですので この後 紹介するAPIを使って 同じ動作を適用することをお勧めします “サポートするAPI” ScribbleをサポートするAPIの概要を 見てみましょう いくつかは既存のAPIで いくつかは新しいものです
Scribbleは iOSからの 既存のText Input APIである― Standard Text Controlsと UIKit Text Inputインフラストラクチャに 依存します さらにiOS 14では 2つの新しいAPIも導入され これらはScribbleの動作を カスタマイズできるようにします
最初に 既存のText Input APIについて お話しましょう Standard Text Controlsは UIKitから入手できる― テキストフィールド テキストビュー 検索フィールドなどです またWebKitを通じ Webページ内において 標準的な編集が可能な Webコンテンツとフォームも含まれます すばらしいことに これらは全てすぐに機能し Scribbleで実にうまく機能します できる限りこれらを 使うことをお勧めします これらはアプリケーションの― ルックアンドフィールに合わせて 大きくカスタイマイズが可能です ただしScribbleは パスワードフィールドを サポートしていません なぜなら パスワードはAutoFillを通じて 入力する方法が推奨されるためです 次はUIKit Text Inputインフラストラクチャです カスタムのテキスト編集体験がある場合 ビューがキーボード および iOSテキスト入力システムを使って 動作するように実装しなければならない 一連のプロトコルがあります Scribbleは テキストビューに話すのと 同じAPIに依存します 特に UITextInputを― 適切かつ完全に実装することは とても重要です これはScribbleが テキストコンテンツや 選択に関する情報をどのように取得するか そして ビュー内のテキストに どのように変更を加えるかです またシステムから 標準のカーソルと 選択UIを取得する際 UITextInteractionを 使うことをお勧めします ご自身でUIを実装する必要はありません これらのトピックについて さらに興味のある方は 過去のWWDC 2012 および2017の すばらしいセッションをご覧ください 次に エヴァンがアプリケーション内の Scribbleの動作について 新しいAPIを使ってカスタマイズする方法の 概要をお話しします ありがとう ダニエル 彼が紹介したように 標準の UIKitテキストコントロールを使うと Scribbleはそのまま機能します しかし Scribble体験の カスタマイズが必要なケースがあります このカスタマイズをサポートするため iOS 14では UIScribbleInteractionと― UIIndirectScribbleInteractionが 導入されました まず UIScribbleInteractionです
インタラクションが ビューに追加されます ここではテキストフィールドに UIScribbleInteractionを追加しました
インタラクションはデリゲートを持ち アプリケーションはデリゲートを通じて Scribble体験をカスタマイズできます 例えば ビュー上でScribbleを無効にすると 手書きが一時的に停止するまで ビューが ファーストレスポンダになることを遅らせたり またはScribbleでの手書き開始時や終了時に 通知を受けたりします 次にUIScribbleInteractionを使用した 実際のケースをいくつか見てみましょう アプリケーションによっては インライン完了フィールドが追加されています 例えば Spotlightの検索フィールドです このフィールドは キーボード入力では うまく機能しますが 手書きでは フィールドから はみ出ることがあります
前にこのフィールドに追加した UIScribbleInteractionを使うことで ビューが現在 手書きを処理しているか チェックして― それに応じて 完了テキストを 更新することが可能です この場合には 単に 完了テキストを隠します 次にScribble用に UIのレイアウトを最適化するため 手書きが完了しているかどうかを 確認する必要があります
確認する場所は 最初の登場時か またはUIの設定時です このとき アプリケーションは UIScribbleInteractionのクラスプロパティ― isPencilInputExpectedを使います このプロパティが“true”のときには アプリケーションは テキストエリアを少し大きくします
ビューの設定の一部として UIを変更するではなく ユーザが書き終えた後に デリゲートメソッドの― scribbleInteractionDidFinishWritingを 通じて UIを更新することも可能です 注意すべき点として これまで紹介したいずれの方法でも UIは ユーザが書いていない間に 変更されます アプリケーションによっては 描画と 編集可能テキストがミックスされます このような場合 描画できるように Scribbleを無効にすることが有効です これは ScribbleInteractionの デリゲートメソッドであるshouldBeginAtを使い アプリケーションが描画モードのときに “false”を返すことによって行えます
次に UIIndirectScribbleInteractionを 見てみましょう
UIScribbleInteractionと同様に UIIndirectScribbleInteractionも ビューに追加されます インタラクションは Reminderによって使用され― 現在のリマインダリストの下に書き込み 新しいリマインダを作成できるようにします
これは タップジェスチャに反応して 編集可能になる― UIに使われるインタラクションでもあります
このインタラクションはデリゲートを持ちます このデリゲートは エレメントに関する システム情報を提供します エレメントとは 書き込むことのできる ビュー内のエリアです 2つ以上のエレメントを含めることが可能で エレメントのサイズは問いません サンプルアプリケーションを用いて― UIIndirectScribbleInteractionが どのように使われたか詳しく説明します
サンプルアプリケーションでは パソコンの背景に刻印を追加できます この刻印エレメントは タップされるまで 編集可能になりません 指でタップすると― ファーストレスポンダになる テキストフィールドがインストールされ 名前を入力できます しかし テキストを削除して― Apple Pencilで書こうとしても このエレメントは機能しません なぜなら 刻印フィールド単独では 編集可能なテキストフィールドではないためです そこで このフィールドが Scribbleで動作するように UIIndirectScribbleInteractionを 追加してみましょう
刻印フィールドを 書き込み可能エリアにするため UIIndirectScribbleInteractionを インストールします
次に 書き込み可能領域を記述する デリゲートメソッドを― 実装する必要があります
最初に実装するものは 全ての書き込み可能エレメントの― 識別子のリストを提供する デリゲートメソッドです
この場合 刻印フィールドは 1つの書き込み可能領域を持ちます このため識別子を用いて ただちに Completionハンドラを呼び出すことができます 次に エレメントの位置に関するシステム情報を 提供する必要があります
これはデリゲートメソッド frameForElementによって行います 書き込むことのできる小さい領域を 返すことも可能ですが ここでは ビュー全体に書き込めるように してみましょう 従ってこの場合では boundsを返すだけです
次に テキスト入力をサポートする レスポンダをフォーカスするよう― システムから要求されるケースを 扱う必要があります これは focusElementIfNeededメソッドによって 行います
テキストフィールドが インストールされていなければ それを作成して ビュー階層に加えます インストールされたテキストフィールドが ファーストレスポンダになるようにします 最後に そのテキストフィールドを Completionハンドラによって返します
システムによって要求される最後の情報は 特定のエレメントが フォーカスされるかどうかを示すことです
この場合 1つのフィールドがあるだけです フィールドがあり それが ファーストレスポンダの場合には"true"を返し そうでない場合には常に"false"を返します
これで 刻印エリアに 私の名前を書こうとすれば― 書くことができます
ScribbleをサポートするAPIを要約すると UIKitからのシステム内の― Standard Text Controls および WebKitがそのまま機能します テキスト入力プロトコルを実装する カスタムのテキストエディタに対しても Scribbleは機能します Scribbleをカスタマイズするため これはiOS 14に追加された2つの インタラクションを通じて行われます Pencilを持って Scribbleを備えた アプリケーションをテストします 前半で説明した設計原理を適用する方法と これらの動作の対部分を― Standard Text Controlsを使って 無料で得る方法を確認してください Scribbleのインタラクションを適用して 書き込み用のスペースを作成したり 予測位置をScribbleに認識させたりして 最終仕上げを行いましょう ご視聴 ありがとうございました iOS 14のアプリケーションで Scribbleが活躍することを楽しみにしています
-
-
9:15 - isHandlingWriting Example
func updateSearchCompletion() { customSearchField.hideCompletionText = interaction.isHandlingWriting }
-
9:35 - UIScribbleInteraction.isPencilInputExpected
override func viewDidAppear(_ animated: Bool) { if UIScribbleInteraction.isPencilInputExpected { let lineHeight = textField.font?.lineHeight ?? 17.0 let heightForScribble = lineHeight * 4.0 heightConstraint.constant = heightForScribble } }
-
9:51 - scribbleInteractionDidFinishWriting
func scribbleInteractionDidFinishWriting(_ interaction: UIScribbleInteraction) { let lineHeight = textField.font?.lineHeight ?? 17.0 let heightForScribble = lineHeight * 4.0 heightConstraint.constant = heightForScribble }
-
10:08 - Should Begin
func scribbleInteraction(_ interaction: UIScribbleInteraction, shouldBeginAt location: CGPoint) -> Bool { return !appIsInDrawingMode() }
-
11:41 - Install UIIndirectScribbleInteraction in Engraving Field
override init(frame: CGRect) { super.init(frame: frame) indirectScribbleInteraction = UIIndirectScribbleInteraction(delegate: self) addInteraction(indirectScribbleInteraction) ... }
-
11:48 - Request Elements
func indirectScribbleInteraction(_ interaction: UIInteraction, requestElementsIn rect: CGRect, completion: @escaping ([ElementIdentifier]) -> Void) { completion(["EngravingIdentifier"]) }
-
12:14 - Frame for element
func indirectScribbleInteraction(_ interaction: UIInteraction, frameForElement elementIdentifier: String) -> CGRect { return bounds }
-
12:28 - Focus Element if Needed
func indirectScribbleInteraction(_ interaction: UIInteraction, focusElementIfNeeded elementIdentifier: String, referencePoint focusReferencePoint: CGPoint, completion: @escaping ((UIResponder & UITextInput)?) -> Void) { if editingTextField == nil { createTextField() } editingTextField?.becomeFirstResponder() completion(editingTextField) }
-
12:57 - Is Element Focused
func indirectScribbleInteraction(_ interaction: UIInteraction, isElementFocused elementIdentifier: String) -> Bool { // Indicate if our only element is currently installed and focused return editingTextField?.isFirstResponder ?? false }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。