我的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?
答案 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)
你不应该切换笔尖,你应该切换控制器。
答案 2 :(得分:0)
每个笔尖需要一个视图,因此你的UIViewController将有两个UIViews。一个用于肖像,一个用于横向。
答案 3 :(得分:0)
为什么你需要为同一个视图使用2个笔尖。你应该使用一个笔尖用于不同的方向。你可以用同样的方法以编程方式处理所需的控件
willRotateToInterfaceOrientation
感谢。