Erste Vorrichtung Orientierung vor der Rotation oder beim Start zu zwingen. Irgendwelche Ideen?
-
08-07-2019 - |
Frage
Ich habe eine Frist bald, und ich habe sehr ärgerlich Fehler vor mir und keine Ideen, wie man es beheben. Das Problem ist, dass manchmal Gerät nicht weiß, was es Orientierung ist, bevor er und gedreht worden ist, so ruiniert sie Frames in bedingten Anweisungen:
if (orient == UIInterfaceOrientationPortrait || orient == 0){
r = CGRectMake(0.0, 0.0, 320.0, 480.0);
// draw stuff
} else {
r = CGRectMake(0.0, 0.0, 480.0, 320.0);
// draw stuff
}
kann dieser Fehler leicht reproduziert werden, wenn ich Gerät halte auf dem Tisch oder in den Händen (horizontale Position) und meine Anwendung ausführen, es zieht Landschaft artige Rechtecken im Portrait-Typ-Bildschirm.
Meine Fragen sind: Kann ich irgendwie die richtige Orientierung in dieser Art von Situation bekommen? Schade, kann es nicht in Simulator reproduziert werden, also bin ich nicht sicher, ob der Code, den ich für diesen Fehler verantwortlich geklebt ist, aber das ist der Ort, wo ich Ansicht Rahmen nach Ausrichtung fixieren. Vielleicht gibt es einen anderen (richtigen) Weg, dies zu tun? Und vielleicht kann ich Anwendung zwingen, im Portrait-Modus zu sein, bis Rotation Ereignis wird gefeuert werden?
Lösung
Ich glaube nicht, dass es ein Fehler ist. Wenn das iPhone auf dem Tisch sitzt die ganze Schwerkraft entlang der Z-Achse meassured. Um zu bestimmen, Geräteausrichtung x-y-Achse verwendet werden, aber keine Beschleunigung wird neben sich in Ihrem Szenario gemessen.
EDIT: Weitere Erläuterungen:
Dieses Bild zeigt, wie die Achse auf dem iPhone orientiert: alt text http://developer.apple. com / iphone / Bibliothek / Dokumentation / UIKit / Reference / UIAcceleration_Class / Kunst / device_axes.jpg
Also, wenn Sie das iPhone auf dem Rücken liegend haben, wird eine Beschleunigung von 1g auf der z-Achse angelegt. So empfangen die gemessenen Beschleunigungen einfach einen Delegierten Implementierung UIAccelerometerDelegate
mit dem UIAccelerometer
shared Instanz registrieren. Siehe AccelerometerGraph Probe, wie dies geschehen ist.
Um festzustellen, ob das iPhone auf dem Tisch sitzt etwas tun, wie folgt aus:
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
// lowPass filter first
// now choose orientation
if (fabs([acceleration z]) >= 0.9) // sitting on the table: choose new mode or lock current mode
if (fabs([acceleration y]) >= 0.9) // probably portrait mode
if (fabs([acceleration x]) >= 0.9) // probably landscape mode
}
Das Beschleunigungsmesser Präzision ist 18mG = 0.018G
so dass berücksichtigen.
Auch müssen Sie sich von den Auswirkungen der sofortigen Bewegungsänderungen zu isolieren, ein einfacher LowPass Filter paßt diese Rechnung perfekt. Die AccelerometerGraph Beispiel zeigt, wie ein solches Filter implementieren.
Auch eine sehr niedrige updateInterval wählen, wenn Sie nicht viel Präzision benötigen, sollten 30Hz für Ihre Zwecke in Ordnung sein.
Andere Tipps
Der Sensor, der die Ausrichtung des Geräts bestimmt ist weder unfehlbar noch intelligent. Wenn Sie das Telefon auf dem Tisch gesetzt und dann zu Fuß um ihn herum, wie soll es wissen, dass es auf dem Kopf ist?