UITabBarController和旋转

时间:2009-02-14 11:57:05

标签: iphone uitabbarcontroller rotation

我遇到了UITabBarController的一个真正问题。 我追求的结果如下: 1)在纵向模式下,一个简单的基于标签栏的应用程序(带导航栏)没什么太花哨的。 2)在横向模式下,我想使用我自己的UIViewController完全忽略UITabBar。

方法(我尝试了很多变种)我最后尝试过但我不明白为什么不“工作”如下:

  • 我有一个自定义UIViewController(调用此AA),假设管理“一切”。
  • 该控制器在应用程序启动时添加到窗口中,并在其loadView中创建两个控制器:UITabBarController(调用此TBC)和UILandscapeController(调用此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视图根本不“喜欢”在标准视图中,而是希望直接附加到屏幕上。 我想知道实现目标的最佳方法是什么,以及为什么tabbar不喜欢成为视图的子视图,

    任何提示大多赞赏。

    -t

    3 个答案:

    答案 0 :(得分:3)

    万一你仍然需要答案,或者其他人偶然发现这个问题,我已经做了同样的事情并且让它发挥作用,但是你必须跳过几个箍。要旋转UITabBarController的视图,您需要做四件事:

    1. 在切换到视图之前删除状态栏
    2. 将视图旋转到新框架
    3. 将状态栏添加回视图
    4. 切换到视图。
    5. 我有一个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 :(得分:1)

    查看文档中的UIViewController实例方法rotatingFooterView

    或者,您可以自己管理TabBar,而不是通过UITabBarController

    答案 2 :(得分:1)

    我认为你的问题来自错字。将removeFromSuperView更改为removeFromSuperview。 虽然,它仍然有问题。标签栏无法正常旋转。它向上移动直到它消失。

    如何不移除标签栏并使其透明。