Как сохранить указание Uiview в определенном направлении независимо от ориентации устройства?

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

Вопрос

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

Это было полезно?

Решение

У Apple есть пример кода, который делает именно то, что вы хотите; Посмотри на это: http://developer.apple.com/library/ios/#samplecode/whichwayisup/introduction/intro.html

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

Что касается ротации, я не уверен. Посмотрите на пример кода «Bubblelevel» здесь: http://developer.apple.com/library/ios/samplecode/bubblelevel/introduction/intro.html#//apple_ref/doc/uid/dts40007331

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

Другие советы

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

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

Как упоминались другие ответы, в Apple достаточно предметов. Bubblelevel Пример кода Чтобы выполнить то, что вы ищете. -[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 Указывает вращение против часовой стрелки.

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

view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top