如何在iOS中获取触摸大小?

6
我知道这个回答明确表示,没有私有函数调用是不可能实现的。因此,按照苹果的条款,这种方法不能在App Store应用中使用。
然而,一些应用程序似乎已经使用了这个函数调用:
  • Penultimate实现了真正的手掌拒绝,而不像Note Taker HD那样需要预定义的拒绝区域
  • Virtuoso实现了压感,他们称之为“TrueVelocity 2”
  • GarageBand也实现了压感
显然,尽管苹果有限制,但这种方法已经被广泛地应用于App Store应用中。 简而言之:iOS上获取触摸大小的私有函数调用是什么?

1
GarageBand使用加速度计来测试触摸速度 - 你对此的假设是错误的。 - Till
4个回答

21

在iOS8中,你可以访问 touch.majorRadius 属性,它是一个 CGFloat 类型,以10.45的倍数增长,并且与所触摸区域的半径成比例(单位为毫米)。touch.majorRadiusTolerance 是第二个可以在iOS8中使用的属性,它提供了触摸半径信息的精确度。在我的测量中,它总是 majorRadius 步长的一半。

在iPad Pro上,触摸屏幕比旧款iPad模型更加敏感,并能够捕捉到Apple Pencil发出的微弱信号,而这些信号在旧款iPad模型上都低于报告阈值。Pencil的触摸半径报告为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);
}

6

大小和压力是两个不同的概念。Penultimate很可能会测试某个区域内大量触摸事件(毕竟手掌面积很大,会产生大量触摸事件)。

触摸“大小”并不存在。IOS触摸事件在手指接触屏幕时生成。然后操作系统从触摸中心点获取信息,这就是你得到的内容。它不是CGRect,而是CGPoint。

压力相对“容易”。这里提供了一种解决方法:使用加速计检测轻按压力

此外,虽然我看到您正在寻找私有API,但github上托管了许多类转储:http://github.com/kennytm/iphone-private-frameworkshttps://github.com/nst/iOS-Runtime-Headers


我知道这是一个老问题,但似乎时代已经改变了。请参考Peter Kämpf的答案。 - SwiftsNamesake

5

如果您对私有方法(即不将其提交到应用商店的方法)感兴趣,您正在寻找的是 -

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

在我(私人!)使用中,10是一个很好的阈值,用于确定一个人是在用手指/触控笔还是将手放在设备上。
希望这对某些人有帮助。再次强调,请不要在应用商店中使用此功能。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接