Получение предупреждения «Использование двухэтапной анимации вращения» с помощью UIImagePickerController - PullRequest
14 голосов
/ 21 мая 2010

Я написал простой код для проверки 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] Использование двухэтапной анимации вращения не поддерживается при вращении нескольких контроллеров представления или контроллеров представления, не являющихся делегатом окна

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

Ответы [ 7 ]

11 голосов
/ 25 сентября 2010

Это сообщение появится, если вы представляете 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];  
}  
1 голос
/ 05 декабря 2010

ВСЕ ВЕРНУТЬСЯ НА УСТРОЙСТВО

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

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

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

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

Я удалил предупреждение, взяв [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, который получается довольно чистый и не нервный.

1 голос
/ 21 сентября 2010

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

0 голосов
/ 02 мая 2012

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

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

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

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

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

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

Приветствия,

0 голосов
/ 20 сентября 2010

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

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

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

РЕДАКТИРОВАТЬ - Добавлен случайный пример кода:

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

- (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 ];
}

Может также работать более короткая задержка.

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

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

0 голосов
/ 21 мая 2010

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

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

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

...