2010-01-20 14 views
13

Ich möchte den Druck der Berührung finden. Ich weiß einfach nicht, wie ich dieses Ergebnis erreichen kann, ohne Jailbreak zu machen und die rohen Touch-Daten zu bekommen. Weiß jemand wie ich das machen würde?Gibt es überhaupt eine Möglichkeit, dass ich sagen kann, wie hart der Bildschirm gedrückt wird

+5

Vielen Dank für die tolle Erkenntnis – Jaba

+5

Also wie erkennen Sie, wenn der Bildschirm dann kaputt ist? – johndodo

+0

apple muss so etwas verwenden, um die Geschwindigkeit in der Garage Band App zu bestimmen. – Jordan

Antwort

28

Sie können den Druck nicht aus dem SDK erhalten noch undokumentierten Methoden. Sie können jedoch die Größe der Berührung mit undokumentierten Methoden erkennen.


Im GSEvent, die eine untergeordnete Darstellung UIEvent ist, gibt es eine Struktur, wie GSPathInfo mit Mitgliedern bekannt:

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; 

Wir bemerken, dass es ein pathPressure und pathMajorRadius ist. Ich kann Ihnen versichern, dass das Druckelement nutzlos ist - es immer ergibt 0. Allerdings enthält pathMajorRadius enthält aussagekräftige Informationen - es gibt den großen Radius der Berührung in Millimetern. Sie können daher eine extrem grobe Schätzung abgeben, wenn es sich um eine starke Berührung oder leichte Berührung aus dem Radius handelt.

-(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"); 
    } 

Lassen Sie mich warnen Sie auch dies ist undokumentierte und Sie sollten es nicht in App Store-Apps nutzen.


Edit: Am 3.2 und höher die pathMajorRadius einen GSPathInfo ist auch erhältlich als undokumentierte Eigenschaft in UITouch:

@property(assign, nonatomic, setter=_setPathMajorRadius:) CGFloat _pathMajorRadius; 

so den obigen Code neu geschrieben werden könnte reines Objective-C unter Verwendung von:

-(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"); 
    } 
+0

Würde Apple die App aus diesem Grund ablehnen. Weil es nicht dokumentiert ist? – Jaba

+2

@Jaba: Ja.Um 'GSEventGetPathInfoAtIndex' zu verwenden, müssen Sie eine Verbindung zum privaten Framework' GraphicsServices' herstellen. Selbst wenn Sie eine späte Bindung durchführen, wird Apple immer noch die Zeichenfolgen '_gsEvent' und' GSEventGetPathInfoAtIndex' finden und ablehnen. – kennytm

+0

Gibt es eine Hintertür, die ich erforschen könnte, wie eine andere Möglichkeit, um dies zum Laufen zu bringen, oder könnte ich über einen anderen Weg auf diese private Datei zugreifen? – Jaba

1

Es ist nicht mit dem SDK möglich. Es gibt diese Daten in keiner Weise frei. Und der Bildschirm spürt keinen Druck auf, und selbst wenn er meldet, dass die "Größe" der Berührung des Betriebssystems unbekannt ist. Leider ist das, was Sie zu tun versuchen, nicht möglich.

Ich weiß, weil ich die gleiche Sache gestellt: Can the iPhone detect the size of a touch?

+0

Es fühlt zwar die Größe der Berührung ab, aber die Information wird verworfen. Siehe meine Antwort. – kennytm

+0

@Kenny: Wo ist deine Antwort und kann ich auf die verworfenen Informationen zugreifen und sie in der App verwenden, ohne dass sie abgelehnt wird? – Jaba

12

In iOS 3.2 und 4.0 können Sie den Wert mehr direkt wie diese:

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

Noch nicht App Store genehmigt, aber handlich für benutzerdefinierte Sachen.

+1

Was meinst du noch nicht App Store genehmigt? Wird Apple meine App ablehnen, wenn ich sie verwende? (Wenn ja, wie erreichen Apps wie Virtuoso Piano das?) – yonix

+3

Einige Apps versuchen mit dem Beschleunigungssensor zu messen, wie "hart" der Benutzer auf den Bildschirm tippt. Ich bin mir nicht sicher über Virtuoso Piano. Soweit ich weiß gibt es noch keine Apple Review Policy, um die in diesem Artikel beschriebenen Touch Radius Informationen zu erhalten. – jminor

13

Ab iOS 8.0 hat UITouch eine öffentliche majorRadius Eigenschaft, die Ihnen die ungefähre Größe der Berührung angibt.