UITouchクラスのヘッダーを見てたらiOS8からmajorRadiusというプロパティが増えていた。
// majorRadius and majorRadiusTolerance are in points
// The majorRadius will be accurate +/- the majorRadiusTolerance
@property(nonatomic,readonly) CGFloat majorRadius NS_AVAILABLE_IOS(8_0);
@property(nonatomic,readonly) CGFloat majorRadiusTolerance NS_AVAILABLE_IOS(8_0);
雑に説明すると、タッチしたときの指の半径を返してくれる。
実際にiPad mini Ratina 2013で試した感じでは下記のような測定値になる
- 人差し指の指先でちょんと触って12から25.75000
- 人差し指をベタっと付けたら51から64.390625程度
- ペンを握るような感じで手を付けると115から270程度
単位はcmとか物理スケールではない気がするが、何かに使えそう。
なんと@shu223 のiOS8SamplerにこのmajorRadiusを含むサンプルコードを追加してもらったので、GitHubにあるアニメーションGIFで雰囲気が伝わる。
デモを見るとわかるが、majorRadiusは実際はデバイスと指の接地面積なんだけど指に力を入れるとだいたい接地面積が増えるので結果的に圧力っぽい錯覚を受けてそれっぽいので何かに使えそう。
majorRadiusToleranceについて
AppleのリファレンスによるとmajorRadiusToleranceは誤差らしく先述の条件で測定したところ6.437500から変わらなかった。
端末をiPhone5sにすると6.378906となり違う値となったため、おそらくデバイス毎に許容誤差として固定値が割り当てられているか工場出荷状態に戻すなど何らかのキャリブレーションによってこの値が変わるのかもしれない、とにかく利用する際にはデバイスごとに違う固定値なのは間違いない。
参考URL
iOS 8 の新機能のサンプルコード集『iOS8-Sampler』を公開しました
http://d.hatena.ne.jp/shu223/20140918/1410979802
UITouch Class Reference
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITouch_Class/index.html#//apple_ref/occ/instp/UITouch/majorRadius