2014-09-17 2 views
0

В моем приложении я поворачиваю UIView на ориентацию устройств, используя CMMotionManager. Идея состоит в том, чтобы поддерживать уровень UIView независимо от того, как пользователь поворачивает его вокруг своей оси z. Изобразите инструмент горизонта в самолетах.Вращающийся UIView к границам ориентации устройства и изменения размера

Это работает очень хорошо, но теперь мне бросают вызов настоящий doozy. Я хочу изменить размер кадра UIView, когда он повернут так, чтобы он всегда точно вписывался в экран устройств. И сохраняет его соотношение сторон. См. Удивительный рисунок ниже.

Любая помощь здесь будет очень признательна!

enter image description here

+0

просмотр лекций 8 и 9 курса: ** Разработка приложений для iOS 7 для iPhone и iPad ** Это бесплатный курс Стэнфорда. Просто найдите его в Google. Это может быть доступно на youtube. –

ответ

1

Предположим, экран устройства имеет ширину W и высоту Н, и вид имеет высоту Н и ширину ш. Вам нужно масштабировать рамку представления с помощью коэффициента масштабирования, чтобы убедиться, что противоположные углы обзора находятся в контакте с краями экрана. Если вы повернули на угол тета, то вы хотите найти самый большой коэффициент масштабирования, который удовлетворяет:

scaling_factor * (h * sin (theta) + w * cos (theta)) < = W; и

scaling_factor * (ч * соз (тета) + W * Sin (тета)) < = Н

Таким образом, повторно организовать эти:

scaling_factor < = W/(h * sin (theta) + w * cos (theta)); и

< scaling_factor = Н/(ч * соз (тета) + W * Sin (тета))

Вычислить каждого из них, и выбрать меньшую из двух. Либо отрегулируйте размер кадра соответственно, либо используйте CGAffineTransformMakeScale, чтобы применить коэффициент масштабирования с помощью свойства преобразования вида. Вам нужно будет слегка отрегулировать эти формулы, если тета отрицательна или больше, чем pi/2, или используйте абс (тета) для отрицательной тета и (пи-тета) для theta> pi/2.