以编程方式更改UIViewController视图NIB的最佳方法

时间:2010-11-30 20:23:48

标签: interface-builder ipad orientation rotation

我的iPad应用程序包含不同的NIB和视图。 每个视图都有两个NIB,一个用于potrait方向,一个用于landscape,所以我正在寻找一种方法来以编程方式为给定的UIViewController切换NIB。

现在我有这个函数,我在每个控制器的willRotateToInterfaceOrientation方法中使用:

void UIHandleRotation( UIViewController *controller, NSString *nibName, UIInterfaceOrientation orientation, BOOL transform ){
    double angle = 0.0;

    if( orientation == UIInterfaceOrientationPortrait ) {
        angle = PI * 2 /* 360° */;
    } 
    else if( orientation == UIInterfaceOrientationLandscapeLeft ){
        angle   = PI + PI/2 /* 270 ° */;
        // Each landscape nib is [nib-name]L
        nibName = [NSString stringWithFormat:@"%@L", nibName];
    }    

    [[NSBundle mainBundle] loadNibNamed:nibName owner:controller options:nil];
    if( transform ) {
        controller.view.transform = CGAffineTransformMakeRotation( angle );
    } 
}

但它给了我奇怪的行为(ui控制位置混乱,出口没有像界面构建器那样关联,等等。)

我做错了什么还是只有更好的方法来实现这个? 感谢

注意:我没有使用导航控制器,因此我无法使用此解决方案Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?

4 个答案:

答案 0 :(得分:3)

你应该只使用一个带有两个视图的NIB,一个用于带有框架(0,0,768,1024)的肖像(potraitView)和 另一个用于横向(landScapeView)的框架(0,0,1024,768)。 并根据您的要求在两个视图中设置控件(potraitView和landScapeView)。

之后,您可以根据设备方向设置视图 -

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
{
landScapeView.hidden = YES;
portraitView.hidden = NO;

}

else{

landScapeView.hidden = NO;
portraitView.hidden = YES;

}
    return (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
            interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown);
}

您好,

正如我想您想知道的,当视图加载时,默认方向是什么,以及如何根据此方向加载视图。 如果这个问题与您提出的问题相同,那么答案就是 -

运行应用程序并加载相同的类视图时, - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 方法被自动调用。然后它返回您的设备方向,并根据此方向设置您的视图(使用与上述相同的代码)。 我想你不需要做更多。

答案 1 :(得分:1)

你不应该切换笔尖,你应该切换控制器。

请参阅以下答案:Easiest Way to Support Multiple Orientations

答案 2 :(得分:0)

每个笔尖需要一个视图,因此你的UIViewController将有两个UIViews。一个用于肖像,一个用于横向。

答案 3 :(得分:0)

为什么你需要为同一个视图使用2个笔尖。你应该使用一个笔尖用于不同的方向。你可以用同样的方法以编程方式处理所需的控件

willRotateToInterfaceOrientation

感谢。