Получение предупреждения "Использование двухступенчатой анимации вращения" с помощью 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] Использование двухступенчатой анимации вращения не поддерживается при вращении нескольких контроллеров представления или контроллеров просмотра, а не делегата окна
Понял, что это значит? Большое спасибо заранее!
Ответы
Ответ 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.