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.
- 1. Gibt es eine Möglichkeit, dass es jemals PHP.NET gibt?
- 2. Gibt es eine Möglichkeit zu sagen, in welche Richtung der Staat mit history.js gehen wird?
- 3. Gibt es eine Möglichkeit zu sagen, ob ReactElement "null" darstellt?
- 4. Verhindern, dass onDestroy aufgerufen wird Bildschirm aus gedrückt
- 5. Gibt es überhaupt einen Code, so dass ich in der Middleware definieren oder konditionieren kann?
- 6. Gibt es eine Möglichkeit, dem Meteor zu sagen, dass eine Sammlung statisch ist (wird sich nie ändern)?
- 7. Gibt es eine Möglichkeit zu wissen, wann CANCEL in der Apple Pay-Ansicht gedrückt wird
- 8. JS: Gibt es eine Möglichkeit zu sagen, welches Objekt eine Funktion genannt wird?
- 9. Wie kann man gnuublot nicht sagen, dass es nicht auf dem Bildschirm erscheint?
- 10. Gibt es eine gute Möglichkeit zu sagen, wenn eine SMS auf Android gelesen wird?
- 11. Gibt es eine Möglichkeit, dass ich eine in einer URL nicht interpretierte Zeichenfolge übergeben kann?
- 12. Gibt es eine Möglichkeit, den Bildschirm als Echtzeitvideo aufzunehmen?
- 13. Gibt es eine Möglichkeit, die Position eines Benutzers berühren zu können, während UIButton gedrückt wird?
- 14. Gibt es eine Möglichkeit zu sagen "Methode gibt das zurück" in Java?
- 15. Gibt es eine Möglichkeit, einen Radiobutton Vorlage, so dass es
- 16. Gibt es eine Möglichkeit zu sagen, ob Code innerhalb des Silverlight Unit Test Framework ausgeführt wird?
- 17. Android Listener zu erkennen, wenn der Bildschirm gedrückt wird
- 18. Gibt es eine Möglichkeit, dass ich eine Winkel-Ui-Router-Lösung vereinfachen kann?
- 19. Gibt es eine Möglichkeit Satz config.action_controller.asset_host setzen in der Entwicklung
- 20. Gibt es eine Möglichkeit, dass Resharper eine nicht verwendete Referenz ignorieren kann?
- 21. Gibt es eine Möglichkeit zu verhindern, dass DLL in einer Software wie Reflektor geöffnet wird?
- 22. Wie kann ich Selen sagen, dass es in einem Druck-Popup auf Abbrechen klickt?
- 23. Gibt es eine Möglichkeit zu verhindern, dass UIImagePickerController Statusleiste ändern?
- 24. Gibt es eine Möglichkeit für eine Java-Anwendung zu erkennen, ob der Bildschirm gesperrt ist?
- 25. Java gibt es eine Möglichkeit zu sehen, ob eine Taste gedrückt wurde, ohne zu blockieren?
- 26. Gibt es eine Möglichkeit zu sagen, ob eine OpenGL-Operation abgeschlossen ist?
- 27. Gibt es eine Möglichkeit, das git-Repository so zu konfigurieren, dass 'git push --force' abgelehnt wird?
- 28. Gibt es eine Möglichkeit, dass ExpressJS Laufzeitfehler protokolliert?
- 29. Objective C Blocks: Gibt es eine Möglichkeit zu vermeiden, dass "Selbst" beibehalten wird?
- 30. Gibt es eine Möglichkeit zu sagen, in welcher DLL sich eine bestimmte .net-Assembly befindet?
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