Как подавить анимацию во время автоповорота - PullRequest
4 голосов
/ 07 августа 2009

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

Если я подавлю эффекты анимации во время вращения, может показаться, что объект никогда не двигался, а все остальное просто встало на место, что я и хочу. Я не смог найти ничего в документации, которая говорит мне, как это сделать, хотя. Как мне это сделать?

Ответы [ 3 ]

1 голос
/ 07 августа 2009

Когда речь идет о ротации 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.

0 голосов
/ 22 июня 2011

Это может работать:

  1. Слушайте willRotateToInterfaceOrientation
  2. [UIView setAnimationsEnabled: NO];
  3. Прослушивание UIDeviceOrientationDidChangeNotification
  4. [UIView setAnimationsEnabled: YES];

Не проверено, но я знаю, что в некоторых случаях это работает.

0 голосов
/ 07 августа 2009

Если вам не нужны анимации вращения, перегрузите -shouldAutorotateToInterfaceOrientation: в вашем UIViewController и верните NO. Затем вы можете наблюдать UIDeviceOrientationDidChangeNotification, чтобы получать уведомления об изменении ориентации вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...