iOS 6旋转bug:尽管旋转,窗口和根视图控制器框架仍不改变

5

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

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

当您旋转iPad时,视图会旋转,但其框架不会更改。 我运行一个定时器,每秒打印我的视图的宽度和高度,尽管我可以在视觉上看到视图旋转,但无论如何,框架始终为“768x1024”。

根据Apple的文档:

当用户界面旋转时,窗口会被调整大小以匹配新的方向。 窗口调整其根视图控制器的框架以匹配新的大小,这个大小反过来传播到其他视图的视图层次结构中。

这正是没有发生的事情,这给我带来了各种麻烦。 有人知道如何修复旋转以使框架更改吗?

重现步骤:

  1. 创建一个新的空项目
  2. 添加一个基本的UIViewController作为根视图
  3. 设置一个计时器以打印出根视图控制器的框架宽度和高度
  4. 运行你的应用程序,并将其旋转。这是我正在测试的代码:
- (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);
// 添加标签以确认方向 UILabel *orientationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10,10,100,30)]; orientationLabel.text = @"左上角"; [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);
}

https://dev59.com/inE85IYBdhLWcg3wnU-p 和 https://dev59.com/BWXWa4cB1Zd3GeqPLEbh 的副本 - Bot
3个回答

1

你尝试将你的UIViewController放在UINavigationController中吗?我曾经遇到过类似的问题,这种方法可以解决它。UINavigationController类似乎比UIViewController更好地处理旋转。

试试这样:

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

1
我想感谢你。我在网上寻找了2天,想找到有人能解释为什么我的5.1应用程序在6.1中完全崩溃了。我在navigationBar和UIView之间得到了一个黑色的条纹,而navigationBar没有旋转,而视图的其余部分确实旋转了。这个简单的神奇代码:self.window.navigationController = self.navigationController; 在AppDelegate中为我修复了它!再次感谢你! - Ælex

0

您可以使用状态栏的状态

 [[UIApplication sharedApplication] statusBarOrientation]

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

0

不是一个 bug。你想要的是使用 bounds 而不是 frame

这样想。当你旋转设备时,设备并没有改变其屏幕大小。它保持不变,但视图正在改变。所以你应该使用 bounds。


它似乎明确地抵消了Apple iOS 6文档中的内容,该文档中说“调整其根视图控制器的框架”。 - user441669
@user441669,有很多重复的问题陈述了这个事情。 - Bot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接