Получение предупреждения «Использование двухступенчатой ​​анимации вращения» с помощью UIImagePickerController

Я написал простой код для проверки UIImagePickerController:

@implementation ProfileEditViewController - (void)viewDidLoad { [super viewDidLoad]; photoTaker_ = [[UIImagePickerController alloc] init]; photoTaker_.delegate = self; photoTaker_.sourceType = UIImagePickerControllerSourceTypeCamera; photoTaker_.showsCameraControls = NO; } - (void)viewDidAppear: (BOOL)animated { [self presentModalViewController: photoTaker_ animated: NO]; } @end 

И я получаю странные предупреждения, например:

2010-05-20 17: 53: 13.838 TestProj [2814: 307] Использование двухступенчатой ​​анимации вращения. Чтобы использовать более плавную одноэтапную анимацию, это приложение должно удалить двухэтапные реализации. 2010-05-20 17: 53: 13.849 TestProj [2814: 307] Использование двухступенчатой ​​анимации вращения не поддерживается при вращении нескольких controllerов вида или controllerов представления, а не делегата windows

Понял, что это такое? Заранее большое спасибо!

Это сообщение появится, если вы представляете UIImagePickerController в другом UIViewController . Поскольку он не толкается, как стек UINavigationController , существует путаница на уровне UIWindow . Я не знаю, является ли предупреждение проблемой, но для устранения предупреждения вы можете сделать следующее:

 // self = a UIViewController // - (void) showCamera { cameraView = [[UIImagePickerController alloc] init]; [[[UIApplication sharedApplication] keyWindow] setRootViewController:cameraView]; [self presentModalViewController:cameraView animated:NO]; } - (void) removeCamera { [[[UIApplication sharedApplication] keyWindow] setRootViewController:self]; [self dismissModalViewControllerAnimated:NO]; [cameraView release]; } 

Возможно, вы добавляете представление корневого UIViewController в качестве подчиненного windows вместо назначения controllerа вида для свойства rootController windows?

IT ALL FALLS BACK ON UI

Это предупреждение может быть реализовано для нескольких разных объектов: подборщики, клавиатура и т. Д.

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

Я видел предупреждение, появившееся в 4.0 и 4.2. В моем случае я работал с поворотом устройства и поймал, была ли клавиатура еще выше (т.е. текстовое поле все еще было первым ответчиком). Если это так, клавиатуре нужно было не отставать от взглядов, но это представляло другие сложности с другими видами.

Поэтому я реализовал отслеживание BOOL, чтобы отслеживать, если keybaordIsPresent, и если это так, я был {textfield resignFirstResponder]; при обнаружении изменения ориентации и сброса текстового поля в getFristResponder после перехода, который был завернут в блок анимации. Мой обработчик BOOL работал лучше, я все еще использую NSNotifications для клавиатуры, но во время поворота были перекрытия уведомлений, потому что клавиатура была уволена без запроса. BOOL устанавливается на NO on Load и когда [textfield resignFirstResponder]; . * not when “- (void) keyboardWillhide является триггером NSNotifications, что дает мне оба рабочих триггера, которые никогда не конфликтуют. BOOL устанавливается в YES, только когда пользователь коснется текстового поля, которое автоматически запускает startFirstResponder.

Я удалил предупреждение, взяв [textfild resignFirstResponder]; вне

 -(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { //if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];} 

} и вернув его в верхней части кода для:

 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { if (keyboardIsPresent == YES) { [self.entryTextField resignFirstResponder]; } //Determine Which Orientation is Present: if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)){ //LANDSCAPE VIEW: [self configureLandscapeView]; }else { //PORTRAIT VIEW: [self configurePortraitView]; } 

}


** Несмотря на то, что у меня не было кода внутри – (void) willAnimatFirstHalfOfRotationToInterface:, предупреждение все еще появлялось. Я думаю, что предупреждение все еще появилось, потому что компилятор все равно должен попытаться использовать метод, пока он пытается выполнить первую анимацию, и поэтому получает двойной анимационный вызов или перекрытие ресурсов. Он не знает, что с этим методом нет исполняемого кода, пока он не пройдет через него. И к тому времени он уже отложил ресурс в подготовке к обработке возможных действий внутри метода.


** Чтобы исключить предупреждение, я должен был удалить или удалить код для willAnimateFirstHalfOfRotation, так что компилятору не нужно даже проверять, есть ли возможная вторая анимация или действие, которое может потребоваться выполнить одновременно ,

 /*-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { //if (keyboardIsPresent == YES) {[self.entryTextField resignFirstResponder];}}*/ 

По завершении перехода в исходный блок анимации я проверяю, была ли «keyboardIsPresent» «ДА» до поворота, и если это так, я снова увольняю первого ответчика. Я использую setAnimationDuration:0.3 который получается довольно чистым и не прыгающим.

Ну, вы представляете UIImagePickerController модально внутри viewDidAppear ProfileEditViewController.

Думать об этом. Это означает, что при просмотре представления ProfileEditViewController появится UIImagePickerController, скажем, позже вы упустите UIImagePickerController, и он вернется в ProfileEditViewController, а затем снова появится viewDidAppear и появится UIImagePickerController, скажем, позже вы упустите UIImagePickerController и вернитесь в ProfileEditViewController, после чего viewDidAppear вызывается снова и … у вас есть идея.

Это предупреждение довольно загадочное, хотя и не уверен, что это то, что он пытается вам сказать. Я бы предложил сделать кнопку где-нибудь на ProfileEditViewController, который вызывает presentModalViewController, а также убедитесь, что у вас есть способ отклонить UIImagePickerController (я никогда не использовал его, не уверен, что он имеет его автоматически).

Возможно, вы пытаетесь одновременно представить два модальных controllerа, и они борются за ресурсы анимации.

1) Для этого редко есть причина UI. Вместо этого вы можете просто перейти непосредственно ко второму controllerу представления (сборщик изображений); и, после отклонения, затем представить первый controller представления или просмотра.

2) Если вам нужно два встроенных controllerа представлений или controller представления поверх представления, тогда установите таймер в viewDidAppear, чтобы представить второй controller представления после того, как первый закончил его анимацию. (Вы можете отобразить фиктивный PNG-изображение пустого сборщика в первом, чтобы предотвратить слишком много мигания дисплея до тех пор, пока второй controller просмотра не выйдет в эфир.)

EDIT – добавлен случайный код:

Я мог бы попробовать заменить это как эксперимент:

 - (void)foo { [self presentModalViewController: photoTaker_ animated: NO]; } - (void)viewDidAppear: (BOOL)animated { NSTimer *bar = [ NSTimer scheduledTimerWithTimeInterval: (2.0f) target: self selector: @selector(foo) userInfo: nil repeats:NO ]; } 

Более короткая временная задержка может также работать.

У меня была такая же проблема. В моем случае была глупая ошибка, которую я ставлю здесь на всякий случай, если кто-то другой попадает в эту же проблему.

В моем приложении с вкладками я удаляю один из исходных ViewControllers и добавляю новый с помощью Storyboard для создания раздела «Настройки».

Этот новый VC должен был быть VC с табличным представлением, и даже я разработал, скомпилировал и запускал его без проблем, когда я изменил ориентацию приложения, которое я продолжал получать с помощью «Использование двухступенчатой ​​анимации вращения».

Моя проблема заключалась в том, что я забыл изменить исходный интерфейс файла .h «UIViewController» для «UITableViewController».

Как только это было сделано, я изменил на значке идентификатора Storyboard class от общего значения до моего SettingsViewController, и это было его окончанием.

Надеюсь, это поможет кому-то другому. Мне потребовалось некоторое время, чтобы понять это.

Ура,

Я думаю, что предупреждение здесь о производительности Core Animation. В качестве теста я загрузил сборщик изображений без каких-либо листов действий или других анимаций, и предупреждения все еще существуют. Я думаю, что это предупреждения, исходящие из самого classа выбора изображений, а не из-за неправильного использования API.

  • Представление controllerа модального вида сразу после отклонения другого
  • Давайте будем гением компьютера.