Wie kann man eine UIView unabhängig von der Geräteorientierung in eine bestimmte Richtung zeigen?

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

Frage

Ich habe eine UIView, die ich immer gegenüberstehen möchte. Sagen Sie also, Sie haben eine UIImageview mit einem Pfeil, und egal wie das Gerät gehalten wird, es zeigt an. Offensichtlich brauche ich das Beschleunigungsmesser, aber es soll das Bild basierend auf den Koordinaten drehen, wenn ich zum ersten Mal funktioniert, da die Rotationen relativ sind. Gibt es eine einfachere Möglichkeit, dies zu tun? Ich habe das Gefühl, dass es irgendwo eine einfache Beispiel -App geben würde, die so etwas tun würde.

War es hilfreich?

Lösung

Apple hat einen Beispielcode, der genau das tut, was Sie wollen. Schau dir das an: http://developer.apple.com/library/ios/#sampecode/waywayisup/Introduction/intro.html

Verwenden Sie die gemeinsam genutzte Instanz von, um bestimmte Bewegungsdaten zu erhalten UIAccelerometer Und es ist Delegierter. http://developer.apple.com/library/ios/documentation/uikit/reference/uiaccelerometerdelegate_protocol/uiaccelerometerdelegate/uiaccelerometerometermeterometermesser.html#/apple_ref/intf/uiamometerometermesser

Was die Rotationen betrifft, bin ich mir nicht sicher. Schauen Sie sich hier den Beispielcode "Bubblelevel" an: http://developer.apple.com/library/ios/samplecode/bubblelevel/inTroduction/intro.html#/apple_ref/doc/uid/dts40007331

Der Beschleunigungsmesser delegierte Dokumentation verweist auf und andere relevante Beispielcode.

Andere Tipps

Waswayisup Ist die Beispielanwendung, nach der Sie suchen - in der iOS -Referenzbibliothek (großartige Dokumente!)

Auf eine Ansicht angewendete Transformationen sind nicht kumulativ. Vielmehr beginnt die Ansicht an das Koordinatensystem seines übergeordneten Übergangs ausgerichtet zu sein, und die Transformation wird relativ dazu angewendet.

Da andere Antworten darauf hingewiesen haben, gibt es genügend Stücke in Apple's Bubblelevel -Beispielcode um das zu erreichen, was Sie suchen. -[LevelViewController accelerometer:didAccelerate:] Enthält bereits ein Beispiel dafür, wie die geglättete Screen-relative Rotationskomponente des Schwerkraftvektors extrahiert werden kann:

// Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes
accelerationX = acceleration.x * kFilteringFactor + accelerationX * (1.0 - kFilteringFactor);
accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor);

// keep the raw reading, to use during calibrations
currentRawReading = atan2(accelerationY, accelerationX);

Angesichts der Koordinatensysteme von UIACCELERATION und atan2, Es gibt einige Faktoren, die Sie beachten müssen, um die gewünschte Rotation Ihrer Ansicht zu berechnen:

  1. Wenn das Gerät im Porträt aufrecht ist, atan2 Gibt -π/2 (-90 °) zurück, da der Eingangs -Schwerkraftvektor {0,0, -1,0, 0,0} beträgt.
  2. CGAffineTransformMakeRotation erstellt eine Transformation, die sich im Uhrzeigersinn (auf iOS) um die angegebene Anzahl von Radians dreht, aber der rohe Winkel von atan2 Gibt eine Rotation gegen den Uhrzeigersinn an.

Dementsprechend möchten Sie Ihre Ansicht nach -(Currentrawreading + π/2) drehen, vorausgesetzt, seine übergeordnete Ansicht ist mit dem Bildschirm im Porträt ausgerichtet:

view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top