Представление UITabBarController модально - проблема с автоповоротом - PullRequest
3 голосов
/ 08 июня 2011

Я пытаюсь представить UITabBarController модально, используя следующий код:

// Declare all view controllers.
TabOne *tabOne = [[TabOne alloc] initWithNibName:@"TabOne" bundle:nil];
TabTwo *tabTwo = [[TabTwo alloc] init];
TabThree *tabThree = [[TabThree alloc] init];

// Set each view controller's delegate to self.
tabOne.delegate = self;
tabTwo.delegate = self;
tabThree.delegate = self;

// Set a title for each view controller.
tabOne.title = @"One";
tabTwo.title = @"Two";
tabThree.title = @"Three";

// Create a tab bar controller.
UITabBarController *tabBarController = [[UITabBarController alloc] init];
[tabBarController setViewControllers:[NSArray arrayWithObjects:tabOne,tabTwo,tabThree, nil]];

// Present the tab bar controller modally.
[self presentModalViewController:tabBarController animated:NO];

// Memory management.
[tabOne release];
[tabTwo release];
[tabThree release];

Это все работает, как и ожидалось, за исключением того, что я получаю следующие предупреждения в консоли:

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

Я провел некоторое исследование по этому вопросу и проверил, что shouldAutorotateToInterfaceOrientation реализован следующим образом:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

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

Я знаю, что это немного из старого каштана, но меня это озадачило.Есть мысли?

Заранее спасибо.

1 Ответ

6 голосов
/ 21 февраля 2012

У меня была похожая проблема.

UITabBarController имеет странное поведение с обработкой ориентации. При установке своей ориентации он рекурсивно вызывает self.selectedViewController, чтобы решить, использовать ли одноэтапную или двухэтапную анимацию. Это кажется разумным, но проблема в том, что self.selectedViewController изначально равен нулю (в частности, если вы впервые отображаете UITabBarController модально), и это может сбить контроллер с толку. В зависимости от версии iOS ноль selectedViewController приведет к тому, что UITabBarController будет считать, что одноэтапная анимация не поддерживается.

Попробуйте это: когда вы впервые загружаете / инициализируете свой UITabBarController, добавьте строку

tabBarController.selectedIndex = 0;

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

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