iOS 6旋转错误:窗口和根视图控制器框架在旋转时不会改变

时间:2012-11-08 21:11:27

标签: ios rotation ios6

  

可能重复:
  “Incorrect” frame / window size after re-orientation in iPhone

我正在尝试使用我的应用程序解决一个非常令人沮丧的问题 - 在研究它时我可能在iOS中发现了一个错误:

旋转iPad时,视图会旋转,但它的框架不会改变。我正在运行一个计时器,每秒打印出我的视图的宽度和高度,虽然我可以看到视图在视觉上旋转,但无论如何,框架仍为“768x1024”。

来自Apple的文档:

  

当用户界面旋转时,将调整窗口大小以匹配新方向。窗口调整其根视图控制器的框架以匹配新的大小,并且此大小依次沿视图层次结构传播到其他视图。

这正是未发生的事情,它给我带来了各种各样的麻烦。有谁知道如何修改旋转以便框架改变?

重现的步骤:

  1. 创建一个新的空项目
  2. 添加骨骼库存UIViewController作为根视图
  3. 设置计时器以打印根视图控制器的帧宽和高度
  4. 运行您的应用,并将其全部旋转。这是我正在测试的代码:
  5. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        self.window.rootViewController = [[UIViewController alloc] init];
    
        NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height);
    
        // Add a label to confirm orientation
        UILabel *orientationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,100,30)];
        orientationLabel.text = @"Top Left";
        [self.window.rootViewController.view addSubview: orientationLabel];
    
        [NSTimer scheduledTimerWithTimeInterval:.3 target:self selector:@selector(testScale) userInfo:nil repeats:YES];
    
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    - (void) testScale {
        NSLog(@"%fx%f", self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height);
    }
    

3 个答案:

答案 0 :(得分:1)

您是否尝试将UIViewController放入UINavigationController中?我有一个类似的问题,它修复了它。 UINavigationController类似乎比UIViewController处理更好的旋转。

尝试这样的事情:

UIViewController *myViewController = [[UIViewController alloc] init];
UINavigationController *myNavigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
self.window.rootViewController = myNavigationController;

答案 1 :(得分:0)

不是错误。您想要的是使用bounds而不是frame

这样想。旋转设备时,设备不会更改其屏幕大小。它保持不变,但观点正在发生变化。所以这就是你想要使用边界的原因。

答案 2 :(得分:0)

您可以使用状态栏的状态

 [[UIApplication sharedApplication] statusBarOrientation]

使用 if语句,您可以知道屏幕是横向还是纵向