Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

ЭТО ВСЕ ПАДЕНИЯ НАЗАД

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

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

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

Поэтому я реализовал отслеживание BOOL, чтобы отслеживать, если keybaordIsPresent, и если да, то я был {textfield resignFirstResponder]; при обнаружении изменения ориентации и reset текстовое поле становится FristResponder после перехода, который был завернут в блок анимации. Мой обработчик 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, который получается довольно чистым и не нервным.

Ответ 4

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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