我想找到触摸的压力。我只是不知道如何在不越狱并获取原始触摸数据的情况下实现该结果。有谁知道我会怎么做?
4 回答
您无法从 SDK或未记录的方法中获得压力。但是,您可以使用未记录的方法检测触摸的大小。
在作为 UIEvent 的较低级别表示的 GSEvent 中,有一个称为GSPathInfo的结构,其中包含成员:
typedef struct GSPathInfo {
unsigned char pathIndex; // 0x0 = 0x5C
unsigned char pathIdentity; // 0x1 = 0x5D
unsigned char pathProximity; // 0x2 = 0x5E
CGFloat pathPressure; // 0x4 = 0x60
CGFloat pathMajorRadius; // 0x8 = 0x64
CGPoint pathLocation; // 0xC = 0x68
GSWindowRef pathWindow; // 0x14 = 0x70
} GSPathInfo;
我们注意到有一个pathPressure
和pathMajorRadius
。我可以向你保证,压力元件是无用的——它总是给出 0。但是pathMajorRadius
确实包含有意义的信息——它给出了以毫米为单位的主要触摸半径。因此,您可以对半径的重触或轻触给出非常粗略的估计。
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
GSEventRef gsevent = [event _gsEvent];
GSPathInfo first_touch = GSEventGetPathInfoAtIndex(gsevent, 0);
if (first_touch.pathMajorRadius >= 9)
NSLog(@"huge (heavy) touch");
else
NSLog(@"little (light) touch");
}
让我再次警告您,这是未记录的,您不应该在 AppStore 应用程序中使用它。
编辑:在 3.2 及更高版本上pathMajorRadius
,GSPathInfo 也可用作 UITouch 中的未记录属性:
@property(assign, nonatomic, setter=_setPathMajorRadius:) CGFloat _pathMajorRadius;
所以上面的代码可以用纯Objective-C重写:
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
UITouch* any_touch = [touches anyObject];
if (any_touch._pathMajorRadius >= 9)
NSLog(@"huge (heavy) touch");
else
NSLog(@"little (light) touch");
}
从 iOS 8.0 开始,UITouch
有一个公共majorRadius
属性可以告诉您触摸的大致大小。
在 iOS 3.2 和 4.0 中,您可以像这样更直接地获取值:
UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];
仍然没有 App Store 批准,但对于定制的东西很方便。
使用 SDK 是不可能的。无论如何,它都不会公开该数据。并且屏幕没有压力感,它是否甚至向操作系统报告触摸“大小”是未知的。可悲的是,您尝试做的事情在合法的应用程序上是不可能的。
我知道是因为我问过同样的事情:iPhone 可以检测到触摸的大小吗?