Как сохранить направление UIView в определенном направлении независимо от ориентации устройства? - PullRequest
1 голос
/ 02 февраля 2011

У меня есть UIView, который я хочу всегда смотреть вверх.Допустим, у вас есть UIImageView со стрелкой, и независимо от того, каким образом устройство удерживается, оно направлено вверх.Очевидно, мне нужен акселерометр, но указание повернуть изображение, основанное на координатах, сработает только в первый раз, я думаю, поскольку повороты относительны.Есть ли более простой способ сделать это?Я чувствую, что где-то будет простой пример приложения, которое будет делать что-то вроде этого.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

Apple имеет пример кода, который делает именно то, что вы хотите; посмотрите на это: http://developer.apple.com/library/ios/#samplecode/WhichWayIsUp/Introduction/Intro.html

Чтобы получить конкретные данные движения, используйте общий экземпляр UIAccelerometer и его делегат. http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAccelerometerDelegate_Protocol/UIAccelerometerDelegate/UIAccelerometerDelegate.html#//apple_ref/occ/intf/UIAccelerometerDelegate

Что касается вращений, я не уверен. Посмотрите пример кода "BubbleLevel" здесь: http://developer.apple.com/library/ios/samplecode/BubbleLevel/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007331

Документация делегата акселерометра ссылается на этот и другой соответствующий пример кода.

0 голосов
/ 04 февраля 2011

Преобразования, примененные к представлению, не суммируются.Скорее, представление начинает выравниваться с системой координат своего родителя, и преобразование применяется относительно этого.

Как уже упоминалось в других ответах, в образце кода BubbleLevel Apple достаточно частей чтобы выполнить то, что вы ищете.-[LevelViewController accelerometer:didAccelerate:] уже содержит пример того, как извлечь сглаженную компоненту относительного вращения экрана вектора гравитации:

// 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);

С учетом систем координат UIAcceleration и atan2 , есть несколько факторов, которые необходимо учитывать при расчете желаемого поворота вида:

  1. Когда устройство находится в вертикальном положении, atan2 вернет -π / 2 (-90 °), поскольку входной гравитационный вектор равен {0,0, -1,0, 0,0}.
  2. CGAffineTransformMakeRotation создает преобразование, которое будет вращаться по часовой стрелке (в iOS) на указанное число радиан, но необработанноеугол от atan2 указывает вращение против часовой стрелки.

Соответственно, вы захотите повернуть ваш вид на - (currentRawReading + π / 2), предполагая, что его родительский вид ориентирован с экраном в портретной ориентации:

view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));
0 голосов
/ 02 февраля 2011

WhichWayIsUp - пример приложения, которое вы ищете - в Справочной библиотеке iOS (отличные документы!)

...