shouldAutorotateToInterfaceOrientation in subview

时间:2012-07-30 03:26:06

标签: iphone orientation device

我在旋转设备时尝试更改视图布局时遇到一些麻烦,我有一个名为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;
}

子视图是否有理由不响应设备方向?该方法从未被调用过。

2 个答案:

答案 0 :(得分:3)

我可以看到您将LandscapeOverviewViewController视图作为子视图添加到self.view
您希望调用LandscapeOverviewViewController的{​​{1}}永远不会发生。
因为这些被称为shouldAutorotateToInterfaceOrientationpushed的控制器不像你正在做的那样。

<强>解决方案: 你可以做两件事 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];
       }
}