6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CocoaAdvent Calendar 2015

Day 3

トラックパッドの触覚フィードバックを利用する

Posted at

これは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を積極的に活用できるとよいでしょう。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?