Когда речь идет о ротации UIViewController, вы можете настроить два способа, чтобы у вас была возможность вращать и перемещать свои собственные виды.
В одношаговом процессе в вашем классе, производном от UIViewController, предоставьте реализацию willAnimateRotationToInterfaceOrientation
. Он вызывается, и вы можете запустить вращение вашего объекта, так что пока система вращает все остальное, ваш объект вращается в противоположную сторону, и, похоже, он остается на месте. Вы захотите рассчитать, сколько нужно повернуть и в каком направлении, основываясь на текущей ориентации интерфейса и новой ориентации.
Другой способ - получить уведомление о выполнении пользовательского поворота в два этапа. Например, в первой половине вы можете уменьшить объект, переместить его и повернуть частично, затем во второй половине закончить вращение, когда вы уменьшите размер до нормального размера. Это довольно умный способ сделать анимацию вращения более гладкой.
Для двухэтапного процесса вам нужно определить два метода. willAnimateFirstHalfOfRotationToInterfaceOrientation
вызывается для первой половины поворота (то есть до 45 градусов для поворота на 90 градусов и на 90 градусов для переворачивания вверх дном). Пройдя эту точку, вторая половина называется через willAnimateSecondHalfOfRotationFromInterfaceOrientation
.
Если ваш объект имеет соотношение сторон 1: 1 (то есть квадрат или круг) и в середине вида, то одностадийный процесс, вероятно, будет работать нормально. Но если это не квадратный объект, и ему нужно переместить позицию (например, если он находится в положении 40, 60 в портретной ориентации, но перемещается в 20, 100 в альбомной ориентации) и, возможно, даже нужно немного масштабировать, чтобы выглядеть лучше, вы можете захотеть Попробуйте двухэтапный процесс и посмотрите, выглядит ли он более гладким.
Если ваш объект находится внутри своего отдельного UIView, тогда довольно легко запланировать вращения с помощью анимации UIView. Просто создайте преобразование через CGAffineTransformMakeRotation
, а затем внутри пары блоков UIView beginAnimations
/ commitAnimations
установите для свойства transform
представления это значение. Вы можете настроить время через setAnimationDuration
.
РЕДАКТИРОВАТЬ: На основе комментариев я добавляю некоторый код, чтобы показать, как вы можете прикрепить представление к окну верхнего уровня вместо контроллера представления. Ваш объект будет находиться в этом представлении вместо того, которым управляет контроллер (который вращается). Вам все еще нужно переопределить методы поворота UIViewController, но вместо того, чтобы вращать объект под управлением контроллера представления, вы вызовете встречное вращение объекта на верхнем уровне.
Чтобы добавить представление в окно верхнего уровня:
YourAppDelegate* windowDelegate = ((YourAppDelegate*) [UIApplication sharedApplication].delegate);
[windowDelegate.window addSubview:yourView];
Сохраните ссылку на yourView
где-то, к чему вы можете добраться, затем в willAnimateRotationToInterfaceOrientation
UIViewController встречное вращение вашего View, т.е. рассчитайте, насколько повернуть представление в обратном направлении, куда вы идете - если телефон поворачивая на 90 градусов по часовой стрелке, вы захотите повернуть вид на 90 градусов против часовой стрелки и т. д. Затем используйте анимацию UIView на yourView
.