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

Jab*_*Jab 13 iphone uitouch pressure

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

ken*_*ytm 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;
Run Code Online (Sandbox Code Playgroud)

我们注意到有一个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");
  }
Run Code Online (Sandbox Code Playgroud)

让我再次警告你,这是没有记录的,你不应该在AppStore应用程序中使用它.


编辑:在3.2及以上版本的pathMajorRadiusGSPathInfo也可以作为UITouch中的未记录属性使用:

@property(assign, nonatomic, setter=_setPathMajorRadius:) CGFloat _pathMajorRadius;
Run Code Online (Sandbox Code Playgroud)

所以上面的代码可以使用纯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");
  }
Run Code Online (Sandbox Code Playgroud)

  • @Jaba:是的.要使用`GSEventGetPathInfoAtIndex`,您需要链接到私有框架`GraphicsServices`.即使你做了后期绑定,Apple仍然会找到字符串`_gsEvent`和`GSEventGetPathInfoAtIndex`并拒绝它. (2认同)

rob*_*off 13

从iOS 8.0开始,它UITouch有一个公共majorRadius属性,可以告诉您触摸的大致尺寸.


jmi*_*nor 12

在iOS 3.2和4.0中,您可以更直接地获取值:

UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];
Run Code Online (Sandbox Code Playgroud)

仍然没有App Store批准,但方便的自定义的东西.

  • 一些应用程序尝试使用加速度计来衡量用户点击屏幕的"难度".我不确定Virtuoso钢琴.据我所知,仍然没有Apple审核政策批准的方式来获取本文所述的触摸半径信息. (3认同)