UIInterfaceOrientation更改在子视图中不起作用

时间:2012-05-11 03:33:57

标签: iphone ios ipad uiinterfaceorientation

我正在为应用添加UIInterfaceOrientation更改。我的应用不是基于标签或基于导航的。我在其他人的基础上添加了子视图。

我查看了为什么界面方向变化不起作用的文档?   http://developer.apple.com/library/ios/#qa/qa1688/_index.html

我发现主窗口控制着界面方向的变化。

但是现在我的应用程序不是基于标签或基于导航的,还有什么办法可以实现吗?

P.S。 :在我的应用程序中,只有启动屏幕可以正常进行界面方向更改,而不是添加的子视图。

请帮忙

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用以下方法调整子视图的大小。或使用autoresizingMask

 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  {
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait){

        viewInformationContainer.frame = CGRectMake(0, 61, 320, 403);// here you can change resize or subviews


    }
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {

        viewInformationContainer.frame = CGRectMake(0, 0, 480, 227);//here you can change resize or subviews


        }
}

希望,这会对你有帮助......

答案 1 :(得分:1)

阅读上面发布的评论以及您所面临的问题是您添加了子视图的层次结构。请考虑以下案例

1)我将视图控制器(VC),导航控制器,标签栏控制器直接添加到窗口中......后续视图将正确地通知任何方向更改。

2)我将一个父视图控制器添加到窗口,然后将一些其他视图控制器的视图添加到我的父视图控制器,在这种特殊情况下,您将获得在父VC中正确调用的方向更改委托方法但不是在后续视图控制器中,您已将视图添加到父VC

我曾经将基本视图控制器添加到我的应用程序窗口,其中基本控制器有一个ScrollView,后来我将我的四个视图控制器的子视图添加到scrollview。

enter image description here

  • (void)viewDidLoad {

    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    
    CGRect viewCustormFrame = appDelegate.viewCustomTabBar.frame;
    viewCustormFrame.origin.y = self.view.frame.size.height-35;
    
    if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
        viewCustormFrame.size.width = self.view.frame.size.width;
    }
    else {
        viewCustormFrame.size.width = self.view.frame.size.width;
    }
    
    [self.view addSubview:appDelegate.viewCustomTabBar];
    appDelegate.viewCustomTabBar.frame = viewCustormFrame;
    
    [srclViewMainContent addSubview:appDelegate.homeController.view];
    [srclViewMainContent addSubview:appDelegate.newsListController.view];
    [srclViewMainContent addSubview:appDelegate.columnController.view];
    [srclViewMainContent addSubview:appDelegate.whatsOnController.view];
    
    currentVisisbleController = appDelegate.homeController;
    
    [self resetAllSizes];
    [super viewDidLoad];
    

    }

在上面的例子中虽然我得到了所有的方向委托方法在基础VC中调用但在其他四个VC中没有。所以我不得不调整像

这样的东西
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    [appDelegate.homeController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.newsListController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.columnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.whatsOnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;

    currentPageOffset = srclViewMainContent.contentOffset.x/srclViewMainContent.frame.size.width;
    [appDelegate.homeController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.newsListController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.columnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.whatsOnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    [self resetAllSizes];
    CGRect visibleRect = CGRectMake(currentPageOffset*srclViewMainContent.frame.size.width, 0, srclViewMainContent.frame.size.width, srclViewMainContent.frame.size.height);
    [srclViewMainContent scrollRectToVisible:visibleRect animated:NO];

    [appDelegate.homeController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.newsListController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.columnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.whatsOnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];

}

即从Base VC在各个VC上调用这些委托方法。我必须这样做,因为我的应用程序是完全构建的,后来我不得不改变架构以允许在各种视图之间滚动,但我已经通过采用四个View控制器实现了这些视图。

简而言之,任何直接添加到窗口的VC(也是导航控制器,标签栏控制器,拆分视图控制器)都会将这些Orientation更改委托方法传播到后续VC,但是View控制器不会将这些委托方法传递给下游的VC。车道

我希望这会给你一些见解。如果您遇到任何好的解决方案,请以答案的形式发布并与我们分享。