Handling Input from Apple Pencil

13202 ワード

https://developer.apple.com/documentation/uikit/pencil_interactions/handling_input_from_apple_pencil
"Learn how to detect and respond to touches from Apple Pencil."
アップルのペンからのタッチを検出して応答する方法を理解します.

Overview

UIKitは、ユーザの指で入力されたタッチと同じように、ユーザにアップルペンのタッチを教える.具体的には、UIKitは、アプリケーションにタッチ位置を含むUITouchオブジェクトを伝達する.しかし、アップルペンからのタッチオブジェクトには、方位角、アップルペンの高さ、入力圧力などの他の情報が含まれています.
Figure 1 Using stylus information as input

アップルペンは独立したデバイスであるため、アップルペンが収集した高さ、方位角、圧力の時間とアプリケーションで既知の値との間に遅延がある.したがって、UIKitは、これらの属性の測定値を早期に提供し、その後、実際の値を提供する.アップルペンの高さ、方位、圧力情報を使用する場合は、これらの測定プロパティを明示的に処理する必要があります.
Note
アップルペンが動作可能な装置は240 Hzのタッチ制御を提供することができる.UIKitは通常60 Hzのレベルで警報を発するので、追加のすべてのタッチは最後の位置を表す1つのタッチポイントに統合される.追加のタッチデータの詳細については、「販売タッチの追加」の「高精度入力の作成」を参照してください.
Getting High-Fidelity Input with Coalesced Touches
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_touches_in_your_view/getting_high-fidelity_input_with_coalesced_touches
https://velog.io/@panther222128/Getting-High-Fidelity-Input-with-Coalesced-Touches

Handle Estimated Properties

UIKitが属性値のみを測定する場合、タグは、対応するUITouchオブジェクトのestimatedPropertiesExpectingUpdates属性を含む.タッチイベントを処理するときは、プロパティを確認して、タッチ情報を後で更新する必要があるかどうかを確認します.
タッチオブジェクトに測定された属性が含まれている場合、UIKitは、タッチを後で確認するためのestimationUpdateIndexの属性にも値を提供する.estimationUpdateIndexの属性値を保持するバイナリキーとして使用してください.キーの値をapp-specificオブジェクトに設定し、タッチ情報を保存します.UIKitがその後実際の値を発行する場合は、インデックスを使用してapp-特定のオブジェクトを検索し、測定値を実際の値に置き換える必要があります.
Listing 1は、タッチデータを取得するためのアプリケーションのaddSamplesメソッドを表す.各タッチについて、方法はタッチ情報を有するカスタムStrokeSampleオブジェクトを作成する.タッチ圧力値が測定値のみである場合、registerForEstimatesメソッドは、estimationUpdateIndexプロパティでキー値を使用してサンプルをディクシャナにキャッシュする.
Listing 1 Tracking touches that need updates
var estimates : [NSNumber : StrokeSample]
 
func addSamples(for touches: [UITouch]) {
   if let stroke = strokeCollection?.activeStroke {
      for touch in touches {
         if touch == touches.last {
            let sample = StrokeSample(point: touch.location(in: self), 
                                 forceValue: touch.force)
            stroke.add(sample: sample)
            registerForEstimates(touch: touch, sample: sample)
         } else {
            let sample = StrokeSample(point: touch.location(in: self), 
                                 forceValue: touch.force, coalesced: true)
            stroke.add(sample: sample)
            registerForEstimates(touch: touch, sample: sample)
         }
      }
      self.setNeedsDisplay()
   }
}
 
func registerForEstimates(touch : UITouch, sample : StrokeSample) {
   if touch.estimatedPropertiesExpectingUpdates.contains(.force) {
      estimates[touch.estimationUpdateIndex!] = sample
   }
}
UIKitがタッチの実際の値を受信すると、UIKitは、リスナーまたはリスナーのtouchesEstimatedPropertiesUpdated(_:)メソッドを呼び出す.UIKitで提供される対応する方法を使用して、実際の測定データを提供してください.
Listing 2は、Listing 1で作成されたキャッシュされたオブジェクトの圧力値を更新するためのStrokeSample方法の一例を示す.方法touchesEstimatedPropertiesUpdated(_:)プロパティの値を使用して、StrokeSampleオブジェクトを測定リストから回収します.後続の圧力値を更新し、ディックバンナから例を削除します.
Listing 2 Updating estimated values
override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) {
   for touch in touches {
      // If the force value is no longer an estimate, update it.
      if !touch.estimatedPropertiesExpectingUpdates.contains(.force) {
         let index = touch.estimationUpdateIndex!
         var sample = estimates[index]
         sample?.force = touch.force
 
         // Remove the key and value from the dictionary.
         estimates.removeValue(forKey: index)
      }
   }
}

Topics


Related Articles


Computing the Perpendicular Force of Apple Pencil


既知の圧力値を3 Dタッチ圧力値と一致させるように調整します.
https://developer.apple.com/documentation/uikit/pencil_interactions/handling_input_from_apple_pencil/computing_the_perpendicular_force_of_apple_pencil
https://velog.io/@panther222128/Computing-the-Computing-the-Perpendicular-Force-of-Apple-Pencil

See Also


Touches


Handling Touches in Your View


ビュー内のコンテンツに複雑なタッチ操作がある場合は、直接ビューサブクラスでタッチイベントを使用します.
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_touches_in_your_view
https://velog.io/@panther222128/Handling-Touches-in-Your-View

Tracking the Force of 3D Touch Events


タッチ圧力による操作内容.
https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/tracking_the_force_of_3d_touch_events
https://velog.io/@panther222128/Tracking-the-Force-of-3D-Touch-Events

UITouch


画面上のタッチポイントの位置、サイズ、動き、圧力を示すオブジェクト.
https://developer.apple.com/documentation/uikit/uitouch
https://velog.io/@panther222128/UITouch