UITabBarКонтроллер и ротация - PullRequest
       16

UITabBarКонтроллер и ротация

4 голосов
/ 14 февраля 2009

У меня реальная проблема с UITabBarController. Результат, которого я добиваюсь, следующий: 1) в портретном режиме простое приложение на панели вкладок (с панелями навигации) ничего особенного. 2) в ландшафтном режиме я хочу использовать свой собственный UIViewController, полностью игнорируя UITabBar.

Подход (я пробовал много вариантов), который я пробовал последним, который я не понимаю, почему «не работает», заключается в следующем:

У меня есть пользовательский UIViewController (назовите это AA), который должен управлять «всем». Этот контроллер добавляется в окно при запуске приложения и в его loadView создает два контроллера: UITabBarController (Call this TBC) и UILandscapeController (Call this LSC). затем я добавляю представление tabbarcontroller как подпредставление представления AA. теперь в классе AA я переопределяю didRotate blah или willRotate blah и в основном хочу переключаться между двумя представлениями, под этим я имею в виду что-то вроде: (псевдокод): переходя от портрета к пейзажу:
[TBC.view removeFromSuperView];
[AA.view addSubview:LSC.view];

и при возврате в портрет поменяйте его.

[LSC.view removeFromSuperView];
[AA.view addSubview:TBC.view];

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

Любые подсказки в основном приветствуются.

-t

Ответы [ 3 ]

3 голосов
/ 28 октября 2009

На тот случай, если вам все еще нужен ответ, или кто-то еще наткнулся на это, я сделал то же самое и заставил его работать, но есть пара обручей, через которые вы должны прыгнуть. Чтобы повернуть представление UITabBarController, нужно сделать четыре вещи:

  1. Удалить строку состояния перед переключением в режим просмотра
  2. Поворот вида на новый кадр
  3. Добавить строку состояния обратно в представление
  4. Переключиться на вид.

У меня есть RootRotationController, который делает это, как это выглядит:

@implementation RootRotationController

#define degreesToRadian(x) (M_PI * (x) / 180.0)

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    if ((UIInterfaceOrientationPortrait == interfaceOrientation) || (UIInterfaceOrientationPortraitUpsideDown == interfaceOrientation)) {
        [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
    }
    // Return YES for supported orientations
    return YES;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
    [super willAnimateRotationToInterfaceOrientation:interfaceOrientation duration:duration];
    if (UIInterfaceOrientationLandscapeLeft == interfaceOrientation) {
        self.view = self.landscape.view;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90));
        self.view.bounds = CGRectMake(0, 0, 480, 300);
    } else if (UIInterfaceOrientationLandscapeRight == interfaceOrientation) {
        self.view = self.landscape.view;
        self.view.transform = CGAffineTransformIdentity;
        self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
        self.view.bounds = CGRectMake(0, 0, 480, 300);
    } else if (UIInterfaceOrientationPortrait == interfaceOrientation) {
        mainInterface.view.transform = CGAffineTransformIdentity;
        mainInterface.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0));
        mainInterface.view.bounds = CGRectMake(0, 0, 300, 480);
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
        self.view = mainInterface.view;
    } else if (UIInterfaceOrientationPortraitUpsideDown == interfaceOrientation) {
        mainInterface.view.transform = CGAffineTransformIdentity;
        mainInterface.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180));
        mainInterface.view.bounds = CGRectMake(0, 0, 300,480);
        [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];
        self.view = mainInterface.view;
    }
}

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

1 голос
/ 17 марта 2009

Думаю, ваша проблема связана с опечаткой. Измените removeFromSuperView, чтобы удалить FromSuperview. Хотя, это все еще имеет проблему. Панель вкладок не вращается должным образом. Он идет вверх, пока не разочарует.

Как насчет того, чтобы не удалять панель вкладок и сделать ее прозрачной.

1 голос
/ 14 февраля 2009

Ознакомьтесь с UIViewController экземпляром метода rotatingFooterView в документации.

Или вы можете управлять TabBar самостоятельно, а не через UITabBarController.

...