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
}
}
デモアニメではなかなか伝わりにくいですが、ボタンを長押しする間に押し込みを強めたり弱めたりしています。