我想找到触摸的压力。我只是不知道如何通过越狱和获取原始触摸数据来实现该结果。有谁知道我会怎么做?
答案 0 :(得分:28)
您无法从SDK 或未记录的方法中获得压力。但是,可以检测未记录方法的触摸大小。
在GSEvent中,它是UIEvent的低层表示,有一个称为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及更高版本中,GSPathInfo的pathMajorRadius
也可用作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");
}
答案 1 :(得分:13)
自iOS 8.0起,UITouch
具有公开majorRadius
属性,可告诉您触摸的大致尺寸。
答案 2 :(得分:12)
在iOS 3.2和4.0中,您可以更直接地获取值:
UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];
仍未获得App Store批准,但对于自定义内容非常方便。
答案 3 :(得分:1)
SDK无法实现。无论如何它都不会暴露这些数据。并且屏幕不会感觉到压力,甚至报告操作系统的触摸“大小”是未知的。可悲的是,你想要做的事情在合法的申请上是不可能的。
我知道,因为我问过同样的事情:Can the iPhone detect the size of a touch?