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
Antwort
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");
}
Würde Apple die App aus diesem Grund ablehnen. Weil es nicht dokumentiert ist? – Jaba
@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
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
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?
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.
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
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
Ab iOS 8.0 hat UITouch
eine öffentliche majorRadius
Eigenschaft, die Ihnen die ungefähre Größe der Berührung angibt.
Vielen Dank für die tolle Erkenntnis – Jaba
Also wie erkennen Sie, wenn der Bildschirm dann kaputt ist? – johndodo
apple muss so etwas verwenden, um die Geschwindigkeit in der Garage Band App zu bestimmen. – Jordan