【问题标题】:Only first UIView added view addSubview shows correct orientation只有第一个 UIView 添加视图 addSubview 显示正确的方向
【发布时间】:2009-09-27 23:38:00
【问题描述】:

我设置了三个 ViewController 来处理三个视图。我遇到的问题是,在模拟器中,方向是 LandscapeRight (这就是我想要的),并且第一个视图在该景观视图中正确显示,但是当我移动到第二个和第三个视图时,它们会出现逆时针旋转 90 度,视图的左上角位于手机屏幕的左下角。几天来我一直在尝试调试它,我得到的最接近线索的方法是通过以下方式对其进行跟踪:

以下是我的应用委托的 applicationDidFinishLaunching:

NSLog(@"1");
[window addSubview:welcomeController.view];
NSLog(@"2");
[window addSubview:goalController.view];
NSLog(@"3");
[window addSubview:planningController.view];
NSLog(@"4");

[window bringSubviewToFront:welcomeController.view];
NSLog(@"5");

我的每个 ViewController 都实现了类似于以下内容(唯一的变化是控制器的名称在传递给 NSLog 的字符串中切换出来):

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
NSLog(@"called for WelcomeController");
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight);
}

这样,我在控制台上得到以下输出:

a
called for WelcomeController
called for WelcomeController
called for WelcomeController
called for WelcomeController
2
called for GoalController
3
called for PlanningController
4
5

我觉得有趣的是 shouldAutorotateToInterfaceOrientation 在添加的第一个视图中被调用了 4 次,而另外两个只被调用了一次。我预计这可能是因为它首先必须进行一些设置(并且我相信模拟器以纵向模式启动,所以它可能会在旋转时调用它),但我发现相关性有点可疑。

我改变了顺序,首先为goalController 调用addSubview,然后为welcomeController 调用。在这种情况下,goalController 以正确的横向显示(通常是欢迎控制器)。这似乎消除了我的 XIB 文件和 ViewControllers 本身。我不确定为什么调用 addSubview 的第一个视图很特殊。我还尝试在索引 0 处使用 insertSubview,结果相同。

【问题讨论】:

    标签: iphone cocoa-touch


    【解决方案1】:

    遇到了同样的问题,显然将子视图添加到 UIWindow 并没有像我预期的那样工作。在添加了一个“虚拟”UIViewController 这是 UIWindow 中唯一的子视图后,我设法解决了这个问题。添加后,它可以完美地向虚拟控制器添加多个子视图,所有子视图都具有正确的方向。

    所以“虚拟”控制器类中的唯一代码是“shouldAutorotateToInterfaceOrientation”函数。这也应该匹配所有其他子视图中的相同功能。

    希望对你有帮助。

    【讨论】:

    • 这对我不起作用(在 iPad 上)。我不是noobsor,但这非常令人沮丧。
    【解决方案2】:

    我有一个similar issue。也不知道为什么。但解决方法是在第一个视图之后的每个视图上调用它:

    [planningController.view setFrame:CGRectMake(0, 0, 480, 300)];

    和之前 -addView。我很好奇这是否对你有帮助。如果我不是唯一遇到此问题和此解决方法的人,那么也许是有原因的。

    【讨论】:

    • 这似乎对我的代码没有帮助。我尝试在相应的 addSubview 调用之前和之后同时调用 goalController 和 PlanningController(我什至尝试切换 300 和 480 ;)它在某些方面似乎确实有所不同,因为在该部分的背景中有欢迎视图没有被覆盖的屏幕,它只是白色的,所以我认为它一定是在屏幕上拉伸了一些东西。
    • 我从您的帖子中注意到的一件事是,您似乎有一个以纵向模式显示的表格视图,页面右侧大约 1/3 为空白。我得到了同样的结果,除了我的视图旋转了 90 度,所以应该是顶部的东西指向左边。
    • 我在 IB 中设计的所有东西都是横向的,这可能是为什么事情指向正确的方向,但没有占据整个屏幕。我从 mainWindow 开始,到 viewControllers 和视图,都是横向的。和你一样,如果我更改视图控制器的顺序,那么无论哪个是第一个,都不需要 setFrame 调用。
    【解决方案3】:

    这远非理想。但是您可以破解第二个视图变换,使其正确旋转。这对我有用,因为我的应用程序只处于横向模式。如果您想改变方向,它可能并不理想。

    [window addSubview:firstController.view];
    [window addSubview:secondController.view];
    CGAffineTransform rotate = CGAffineTransformMakeRotation(M_PI/2.0);
    [backgroundViewController.view setTransform:rotate];
    CGRect contentRect = CGRectMake(0, 0, 1024, 768); 
    backgroundViewController.view.bounds = contentRect; 
    [backgroundViewController.view setCenter:CGPointMake(768/2, 1024/2)];
    

    【讨论】:

      【解决方案4】:

      我想我有一个可行的解决方案。添加一个视图,然后立即删除它,对每个视图重复,然后添加所有三个。像这样:

      [window addSubview:welcomeController.view];
      [welcomeController.view removeFromSuperview];
      [window addSubview:goalController.view];
      [goalController.view removeFromSuperview];
      [window addSubview:planningController.view];
      [planningController.view removeFromSuperview];
      
      [window addSubview:welcomeController.view];
      [window addSubview:goalController.view];
      [window addSubview:planningController.view];
      

      它似乎工作,至少在模拟器中。

      【讨论】:

      • 这适用于我在 iPad 4.2 模拟器上,但不适用于 3.2(不幸的是我仍然必须支持)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多