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

2019-08-16 22:37发布

我有三个ViewControllers设立处理三个视图。 我遇到的问题是,在模拟器的方向是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");

我的每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次,多数民众赞成加入的第一个视图,而其他两个只得到调用一次。 我预计,这可能是因为它有起初做一些设置(我相信模拟器在纵向模式下开始了,所以它可能会调用它,而做旋转),但我发现的相关性有点怀疑。

我切换顺序周围,使得addSubview被称为该goalController第一和第二welcomeController。 在这种情况下,这是它显示了正确的横向(这是正常的欢迎控制器)的goalController。 这似乎消除我的XIB文件和ViewControllers自己。 我不知道为什么在那里addSubview被称为第一种观点是特别的。 我在相同的结果指标0使用insertSubview也试过。

Answer 1:

遇到同样的问题,显然增加子视图一个UIWindow不工作我预期的方式。 我设法增加一个“虚拟”后解决问题UIViewController是在一个UIWindow的唯一子视图。 添加一个后,它完美地将多个子视图添加到虚拟控制器,所有正确的方向。

因此,在“虚拟”的控制器类唯一的代码是“ shouldAutorotateToInterfaceOrientation ”功能。 这也应该与所有其它子视图相同的功能。

希望能帮助到你。



Answer 2:

我有一个类似的问题 。 不知道为什么无论是。 但是,解决方法是调用这个在第一个后,每看法:

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

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



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



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

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



文章来源: Only first UIView added view addSubview shows correct orientation