我想找到触摸的压力。我只是不知道如何在不越狱和获取原始触摸数据的情况下完成该结果。有人知道我会怎么做吗?

最佳答案

您无法从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");
  }

关于iphone - 有什么办法可以告诉我按下屏幕的力度吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2103447/

10-14 21:49
查看更多