タッチの圧力を見つけたい。脱獄して生のタッチデータを取得せずにその結果を達成する方法がわかりません。誰も私がこれを行う方法を知っていますか?
4 に答える
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");
}
iOS 3.2 および 4.0 では、次のように値をより直接的に取得できます。
UITouch* touch = ...// get the touch object
float radius = [[touch valueForKey:@"pathMajorRadius"] floatValue];
まだ App Store の承認は得ていませんが、カスタム用には便利です。
SDK では不可能です。とにかく、そのデータは公開されません。また、画面は圧力を感知せず、タッチの「サイズ」を OS に報告するかどうかも不明です。悲しいことに、あなたがやろうとしていることは、合法的なアプリケーションでは不可能です.
私は同じことを尋ねたので知っています: iPhone はタッチのサイズを検出できますか?