Как сохранить указание Uiview в определенном направлении независимо от ориентации устройства?
-
28-10-2019 - |
Вопрос
У меня есть 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, есть несколько факторов, которые вам нужно помнить, чтобы рассчитать желаемое вращение вашей точки зрения:
- Когда устройство вертикально в портрете,
atan2
вернет -π/2 (-90 °), поскольку входной гравитационный вектор составляет {0,0, -1,0, 0,0}. CGAffineTransformMakeRotation
Создает преобразование, которое будет вращаться по часовой стрелке (на iOS) указанным количеством радиан, но необработанный угол отatan2
Указывает вращение против часовой стрелки.
Соответственно, вы захотите повернуть свое представление по -(CurrawRawReading + π/2), предполагая, что его родительское представление ориентировано на экран в портрете:
view.transform = CGAffineTransformMakeRotation(-(currentRawReading + M_PI/2));