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

我有三个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

我发现有趣的是,应该为所添加的第一个视图调用4次shouldAutorotateToInterfaceOrientation,而另外两个只调用一次。 我期望这可能是因为它首先要做一些设置(我相信模拟器是以纵向模式开始的,所以它可能会在旋转时调用它),但我发现相关性有点可疑。

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


跑到同样的问题,显然添加子视图到UIWindow不符合我预期的方式。 我添加了一个“虚拟” UIViewController ,它是UIWindow中唯一的子视图,我设法解决了这个问题。 在添加完一个之后,它完美地将多个子视图添加到虚拟控制器,所有这些都以正确的方向进行。

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

希望能帮助到你。


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

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

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


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

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

链接地址: http://www.djcxy.com/p/43295.html

上一篇: Only first UIView added view addSubview shows correct orientation

下一篇: What is the purpose of (Apache) putting inode into an ETag?