13

タッチの圧力を見つけたい。脱獄して生のタッチデータを取得せずにその結果を達成する方法がわかりません。誰も私がこれを行う方法を知っていますか?

4

4 に答える 4

28

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 アプリでは使用しないでください。


編集: GSPathInfo の 3.2以降では、UITouch の文書化されていないプロパティpathMajorRadiusとしても利用できます。

@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");
  }
于 2010-01-20T18:03:54.600 に答える
12

iOS 3.2 および 4.0 では、次のように値をより直接的に取得できます。

UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];

まだ App Store の承認は得ていませんが、カスタム用には便利です。

于 2010-07-09T18:59:08.950 に答える
1

SDK では不可能です。とにかく、そのデータは公開されません。また、画面は圧力を感知せず、タッチの「サイズ」を OS に報告するかどうかも不明です。悲しいことに、あなたがやろうとしていることは、合法的なアプリケーションでは不可能です.

私は同じことを尋ねたので知っています: iPhone はタッチのサイズを検出できますか?

于 2010-01-20T17:29:38.703 に答える