Erste Vorrichtung Orientierung vor der Rotation oder beim Start zu zwingen. Irgendwelche Ideen?

StackOverflow https://stackoverflow.com/questions/1638690

  •  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?

War es hilfreich?

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 UIAccelerometershared 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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top