有什么办法可以告诉我屏幕有多难按下

时间:2010-01-20 17:26:33

标签: iphone uitouch pressure

我想找到触摸的压力。我只是不知道如何通过越狱和获取原始触摸数据来实现该结果。有谁知道我会怎么做?

4 个答案:

答案 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;

我们注意到有pathPressurepathMajorRadius。我可以向你保证,压力成员是无用的 - 总是给出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?