首页 文章

iOS 6旋转错误:窗口和根视图控制器框架不会改变,尽管旋转[重复]

提问于
浏览
5

可能重复:iPhone中重定向后的“不正确”框架/窗口大小

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

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

来自Apple的文档:

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

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

重现步骤:

  • 创建一个新的空项目

  • 添加骨骼库存UIViewController作为根视图

  • 设置计时器以打印根视图控制器的帧宽和高度

  • 运行您的应用,并将其全部旋转 . 这里's my code I' m测试用:

- (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 回答

  • 1

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

    尝试这样的事情:

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

    不是错误 . 你想要的是使用 bounds 而不是 frame

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

  • 0

    您可以使用状态栏的状态

    [[UIApplication sharedApplication] statusBarOrientation]
    

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

相关问题