2009-02-14 5 views
4

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

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

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

    и при возврате на портрет обратный.

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

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

    любые намеки в основном оценили.

    -t

    +0

    Здесь я разместил свое решение/experince в контроллере панели управления с поворотами: http://stackoverflow.com/a/12774037/751641 – wzbozon

    ответ

    2

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

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

    +1

    Спасибо за отзыв! Однако я не понимаю, почему мой предложенный подход не работает. Я уверен, что должен быть способ создать интерфейс, который я ищу, его довольно простой. Мне не хватает чего-то простого. Я не думаю, что эта проблема требует создания полного менеджера TabBar. Любые другие предложения? – Tzur

    1

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

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

    3

    На всякий случай вам все еще нужен ответ, или кто-то еще наткнулся на это, я сделал то же самое и получил его работу, но есть несколько обручей, с которыми вам нужно прыгать. Для того, чтобы повернуть вид на 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 вызываются только после добавления вида корневого контроллера к окну, так что вы вам нужно снова включить панель состояния сразу после этого в делетете приложения.