これはCocoa Advent Calendar 2015の3日目です。
はじめに
Macにおける2015年の大きなトピックの一つにForce Touchトラックパッドの登場がありました。Force Touchの最大の特徴であるクリックの強弱をCocoaから扱う方法については以前書いたので、今回はもう一つの特徴である触覚フィードバックをCocoaから扱う方法について紹介します。
触覚フィードバックとは
触覚フィードバック(haptic feedback)は、Force Touchトラックパッドに搭載されている機能の一つで、トラックパッドに小さな振動を発生させることでこれに触れているユーザの指に対して物理的なフィードバックを与えることができるのが特徴です。トラックパッドを押し込むとクリック感を得ることができますが、Force Touchトラックパッドではこのクリック感は触覚フィードバックによって実現されています。この触覚フィードバックはクリック時以外にも利用することができ、実際に一部のApple製のアプリケーションで活用されています。
NSHapticFeedbackPerformer
触覚フィードバックを利用するためのメソッドはEl Capitanで新しく導入されたNSHapticFeedbackPerformer
プロトコルにまとめられています。NSHapticFeedbackManager.defaultParameter()
を呼び出すことで、このプロトコルの実装を取得することができます。
このプロトコルで定義されているメソッドは次の一つだけです。
func performFeedbackPattern(_ pattern: NSHapticFeedbackPattern, performanceTime performanceTime: NSHapticFeedbackPerformanceTime)
このメソッドを呼び出すことで、トラックパッドを振動させて触覚フィードバックを行うことができます。
NSHapticFeedbackPatterns
NSHapticFeedbackPatterns
は触覚フィードバックの種類を指定するもので、次のいずれかの値をとります。
.LevelChange
.Alignment
.Generic
.LevelChange
は、ユーザがトラックパッドを押す強さが変わった場合に、それをフィードバックするために使用します。例えば、2段階の強さを受け付けるボタンがあった場合、1段階目から2段階目に切り替わる際にそれをユーザにフィードバックする必要がありますが、そういった場合にこれを指定します。
.Alignment
は、ユーザがオブジェクトを移動させたりリサイズさせたりする際にそのガイドを行うために使用します。例えば、XcodeのxibエディタをForce Touchトラックパッドで操作しているとコントロールの操作を行っている際にグリッドに吸い付くような触覚フィードバックを得ることができますが、それと同様のものをアプリケーションで実装する場合にはこれを指定するようにします。
.Generic
は上記の例に当てはまらないような場合に指定します。
NSHapticFeedbackPerformanceTime
NSHapticFeedbackPerformanceTime
は触覚フィードバックを行うタイミングを指定します。.Now
を指定すると呼び出しと同時にフィードバックを行いますが、.DrawCompleted
を指定するとこれを描画完了まで遅らせることがでるため、ビューの特性に応じて使い分けることができます。
サンプルコード
Swift Playgroundで下記のコードを入力することで、Cocoaにおける触覚フィードバックを試すことができます。トラックパッドに指を置いていると、1秒おきに振動するのを確認することができます(当然ながらForce Touchトラックバック以外では確認できません)。
import Cocoa
let performer = NSHapticFeedbackManager.defaultPerformer()
for _ in 0..<10 {
performer.performFeedbackPattern(.Alignment, performanceTime: .Now)
sleep(1)
performer.performFeedbackPattern(.LevelChange, performanceTime: .Now)
sleep(1)
performer.performFeedbackPattern(.Generic, performanceTime: .Now)
sleep(1)
}
おわりに
強いクリックについては使いどころが難しいといわれていますが、触覚フィードバックはグリッドガイドのようにわかりやすい利用例があるため、そういった場面ではこのAPIを積極的に活用できるとよいでしょう。