如何获得iOS的触摸大小?

我明白, 这个回应清楚地表明,这是不可能的,没有私人函数调用。 因此,根据苹果的条款,这种方法不能用于App Store应用程序。

但是,一些应用程序似乎已经使用这个函数调用:

  • 倒数第二的实际手掌拒绝没有预先定义的拒绝区域,像在笔记本高清
  • Virtuoso的压力敏感度,他们称之为“TrueVelocity 2”
  • GarageBand也用于压力敏感度

显然,尽pipe苹果受到限制,但这种方法已经在App Store应用程序中广泛使用。

tl; dr什么是iOS上的私人函数调用来获取触摸大小?

大小和压力是两种不同的动物。 倒数第二最有可能的testing是在某个区域进行大量的触摸(手掌毕竟有大面积的触摸)。

触摸“尺寸”不存在。 当手指触摸屏幕时会产生IOS触摸事件。 然后操作系统从触摸中取得一个中心点,这就是你得到的。 这不是CGRect,而是CGPoint。

虽然压力“更容易”。 请参阅此处了解变通方法: 使用加速计轻敲压力强度检测

虽然我看到你在私人API的市场,github承载了一些类转储: http : //github.com/kennytm/iphone-private-frameworks和https://github.com/nst/iOS-运行时,头

使用iOS8,您可以访问touch.majorRadius属性,该属性是CGFloat ,以10.45的倍数增长,并以毫米为单位与触摸区域的半径成比例。 touch.majorRadiusTolerance是iOS8可以使用的第二个属性,它提供了触摸半径信息的准确性。 在我的测量中,它始终是主majorRadius步长的一半。

在iPad Pro上,触摸屏的灵敏度提高了三倍,并从苹果笔中获取了低于报告阈值的较弱的iPad信号。 铅笔的触摸半径报告为0.25,而即使是最轻微的手指接触也会报告为20.84或更多。

在你的UIView方法中像这样使用它:

 - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // Regular multitouch handling. [super touchesBegan:touches withEvent:event]; CGPoint center = [touch locationInView:self]; NSLog(@"Touch detected at %6.1f | %6.1f", center.x, center.y); CGFloat radius = [touch majorRadius]; NSLog(@"Radius = %5.1f; lower limit = %5.1f; upper limit = %5.1f", radius, radius-touch.majorRadiusTolerance, radius+touch.majorRadiusTolerance); } 

如果您对私有产品感兴趣(即不要将其提交给app store方法,那么您正在寻找 –

 @interface UITouch (Private) -(float)_pathMajorRadius; @end 

在我的(私人!)使用这个, 10是一个很好的门槛,以确定一个人何时使用他们的手指/手写笔或手放在设备上。

希望这对某人有帮助。 再一次, 不要在App Store中使用它。

FYI看起来像iOS 8引入了一些估计UITouch的半径的属性: majorRadiusmajorRadiusTolerance

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITouch_Class/index.html