Force Touchトラックパッドでは「強めのクリック」という操作がサポートされていて、たとえばSafariでリンクを強めにクリックするとリンク先のプレビューがポップオーバーされます。ここでは、NSButtonを強めのクリックに対応させる方法を紹介します。
強めのクリックに対応したボタンを作成
まず、NSButtonはデフォルトの状態では強めのクリックを利用できないため、下記のようにbutton typeをMultiLevelAcceleratorButtonへ変更して強めのクリックを利用できるよう設定します。
button.setButtonType(.MultiLevelAcceleratorButton)
button.maxAcceleratorLevel = 5
ここでは一緒にmaxAcceleratorLevelを5に設定しましたが、これはクリックの強さを5段階(1:通常〜5:最強)で受け付けるということです。MultiLevelAcceleratorButtonの場合のデフォルト値は2で、それ以外のbutton typeの場合は1がデフォルトです。1の場合は強いクリックを受け付けません。
クリック時に強さのレベルを取得する
強いクリックは、通常のクリックと同じようにtargetに対してactionを実行します。このとき、クリック中に強さレベルが変わる(通常クリック中に強く押し込むなど)と、その都度actionが実行されます。
action中でクリックの強さを取得するには、NSButtonのintegerValueプロパティを参照します。通常のクリックが行われた場合にはこの値は1に、強いクリックが行われた場合にはこの値が2以上になります。最大値はmaxAcceleratorLevelに設定した値になります。
なお、Force Touchに対応していないトラックパッドからのクリックはすべてintegerValueが1になります。
デモ
下記のように、5段階のクリックを受け付けて、そのクリックレベルをNSLevelIndicatorへ表示させるサンプルを作成して実行してみました。
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet var button: NSButton!
@IBOutlet var indicator: NSLevelIndicator!
func applicationDidFinishLaunching(aNotification: NSNotification) {
button.setButtonType(.MultiLevelAcceleratorButton)
button.maxAcceleratorLevel = 5
}
@IBAction func click(sender: AnyObject?) {
indicator.integerValue = button.integerValue
}
}
デモアニメではなかなか伝わりにくいですが、ボタンを長押しする間に押し込みを強めたり弱めたりしています。
