2010-11-09 128 views
3

我感兴趣的是有一个支持所有方向的UIViewController,并干净地使用两个xib文件来设置它的子视图。如何使用xib文件支持纵向和横向方向?

一种可能性似乎是在每次旋转时使用NSBundle的loadNibNamed:方法来加载新的视图层次结构,但这看起来效率低下,并且可能具有不幸的副作用。例如,从nib文件重新加载后,我的所有视图都将丢失以前的状态,例如将文本添加到文本字段等。

有没有更好的方法来做到这一点?

+0

是否有一个特定的原因,您的界面必须有足够的差异,才能在纵向和横向之间使用2个xib?在界面生成器中使用增长/附加自动调整设置,您几乎可以始终让UI自动旋转。如果你绝对必须这样做,我会一次加载,然后在轮换期间交换意见。 – slycrel 2010-11-09 06:52:49

+4

考虑到宽高比的显着变化,我认为选择明显不同的每个方向布局是非常合理的。 – Tyler 2010-11-10 19:43:52

+0

我同意。旧帖子我在这里发表评论,但我一直在寻找适合于此的解决方案,并且一直没有找到。拥有与纵向视图非常不同的横向视图是绝对合适的。以股票应用为例。它以横向模式显示图表!我不知道为什么每个人都说你不应该表现出不同的观点并不断依靠自动调整大小。对我自动调整大小是一个警察。景观视图几乎是一个全新的环境,应该有一个特定的设计 - 可能还有其他有用的功能。 – Christopher 2012-06-13 05:36:21

回答

3

经过一些研究,我无法找到一个优雅的解决方案。因为在每次旋转时从xib文件重新加载元素看起来很慢并且消除了任何动态的基于视图的数据,所以我切换到基于代码的设置(即不再有xib文件)。

我决定建立这样一个方法:

// This is for an iPad root-level view controller. 
- (void)setupForOrientation:(UIInterfaceOrientation)orientation { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
    CGRect bounds = CGRectMake(0, 0, 768, 1004); 
    bkgImageView.frame = bounds; 
    // Other view positioning for portrait. 
    } else { 
    CGRect bounds = CGRectMake(0, 0, 1024, 748); 
    bkgImageView.frame = bounds; 
    // Other view positioning for landscape. 
    } 
    [self drawBackgroundForOrientation:orientation]; 
} 

这种方法是从shouldAutorotateToInterfaceOrientation:方法调用,递给了新的方向。

+0

我使用相同的技术。感谢UIInterfaceOrientationIsPortrait宏! – rjobidon 2013-08-28 02:02:29

1

而不是从shouldAutorotateToInterfaceOrientation调用你的函数,你只需要说是或否,你应该真的在代理函数中做你的东西,比如willRotateToInterfaceOrientation,它的意思是做你正在做的事情。