只有第一个UIView添加的视图addSubview显示正确的方向

时间:2009-09-27 23:38:01

标签: iphone cocoa-touch

我已经设置了三个ViewControllers来处理三个视图。我遇到的问题是在模拟器中方向是LandscapeRight(这是我想要的),并且第一个视图在该横向视图中正确显示,但是当我移动到第二个和第三个视图时,它们会出现逆时针旋转90度,手机屏幕左下角的视图左上角。我一直在尝试调试这几天,而我最接近线索的是跟踪它:

以下是我的app delegate的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");

我的每个ViewControllers实现类似于以下内容的东西(唯一的变化是在传递给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次,而其他两个只被调用一次。我希望这可能是因为它首先必须进行一些设置(我相信模拟器在纵向模式下启动,因此它可能在进行旋转时调用它),但我发现相关性有点可疑。 / p>

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

4 个答案:

答案 0 :(得分:4)

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

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

希望它有所帮助。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

这远非理想。但你可以破解第二个视图转换,以便正确旋转。这适用于我,因为我的应用程序只在横向模式下。如果你想改变方向,这可能并不理想。

[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)];

[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)];

答案 3 :(得分:0)

我认为我有一个似乎有效的解决方案。添加一个视图,然后立即删除它,为每个视图重复,然后添加所有三个视图。像这样:

[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];

它似乎有效,至少在模拟器中。