我在旋转设备时尝试更改视图布局时遇到一些麻烦,我有一个名为OverviewViewController的主视图,它由2个视图组成,当设备处于某个方向时将隐藏/显示。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// do some layout stuff
NSLog(@"OverviewViewController shouldAutorotateToInterfaceOrientation");
return YES;
}
每次旋转设备时,此方法都会执行两次,但在任何子视图中,它都不会被调用,例如;
// In OverviewViewController
_landscapeView = [[LandscapeOverviewViewController alloc] initWithNibName:nil bundle:nil];
[self.view addSubview:_landscapeView.view];
// In LandscapeOverviewViewController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
NSLog(@"LandscapeOverviewViewController: shouldAutorateToInterfaceOrientation");
// Only change orientation when it's landscape
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) return YES;
return NO;
}
子视图是否有理由不响应设备方向?该方法从未被调用过。
答案 0 :(得分:3)
我可以看到您将LandscapeOverviewViewController
视图作为子视图添加到self.view
。
您希望调用LandscapeOverviewViewController
的{{1}}永远不会发生。
因为这些被称为shouldAutorotateToInterfaceOrientation
或pushed
的控制器不像你正在做的那样。
<强>解决方案:强> 你可以做两件事 1.
presented
2。您可以在- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// do some layout stuff
NSLog(@"OverviewViewController shouldAutorotateToInterfaceOrientation");
//Call explicitly shouldAutorotateToInterfaceOrientation of LandscapeOverviewViewController
[_landscapeView shouldAutorotateToInterfaceOrientation:interfaceOrientation];
return YES;
}
答案 1 :(得分:0)
是否需要在overviewViewController中使用两个单独的viewcontrollers(每个方向一个)?
如果您只是根据方向更改帧值,请确保使用autoresizingmasks。
如果没有,只需为每个方向使用单独的视图,并根据需要隐藏取消隐藏每个视图。
目前的问题是,你的lanscapeViewController没有人向它发送viewControllerEvents。
使用当前设置,您可以以模态方式呈现这些视图控制器,并在OverviewViewController中使用此代码
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{
{
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
[self presentModalViewController:LandscapeOverviewViewController animated: NO];
}
else{
[self presentModalViewController:PortraitOverviewViewController animated: NO];
}
}