2011-03-23 86 views
1

所以我建立我的应用程序旋转,和我已经设置了所有的按钮翻译使用下面的方法手动:两个笔尖,相同的对象(iPhone)

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)x 
            duration:(NSTimeInterval)duration{ 

CGRect bounds = [[self view] bounds]; 

if (UIInterfaceOrientationIsPortrait(x)) { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 194)]; 
} 
else { 
    [anObject setFrame: CGRectMake(0, 0, bounds.size.width, 110)]; 
} 

} 

我设置了各对象在两个方向上的位置。这似乎是一个可怕的方式来完成我的目标..

所以现在我想要做的是复制我的主要笔尖,并设置所有按钮的位置在新的笔尖风景。然后当设备旋转时,调用相应的笔尖。这是可行的/可行的/一个好方法吗?

我该如何调用笔尖旋转?我可以使用相同的IBconnections完全相同的对象吗?

有没有更好的方法?

+0

我不认为这是一个好主意。加载旋转视图是更改子视图帧的更多开销。我经常做的是在IB中的肖像中布置按钮,然后将IB中的视图更改为横向,并查看是否可以仅使用布局/拉伸选项调整/调整按钮。 – NWCoder 2011-03-23 22:54:25

+0

我试过了布局选项......不幸的是,没有配置会改变为所需的定义,感谢评论。 – ultifinitus 2011-03-23 23:16:40

回答

3

根据我需要的行为,我使用了几种不同的方法。看看哪个最适合你。

  1. 找到一套规则,让你只用autoresizingMaskautoresizesSubviews支持两个方向。

  2. 为父视图的-layoutSubviews查找一组规则,以便子视图可以相对于父视图的边界重新排列。这比自动调整更有效,但比每个子视图的两个硬编码位置更好。这通常需要创建更深层次的视图层次结构,以便使用不同的-layoutSubviews行为来嵌套多个视图,以便在可见子视图周围获得适当的定位和间距。

  3. 有两个子视图,每个方向一个子视图。旋转时隐藏一个。这允许在子视图之间进行自定义转换,如果您加载新的笔尖并替换根视图,则不会得到这些子视图。如果从它自己的笔尖加载每个子视图,则可以卸载任何一个不再可见的子视图以减少内存使用。然后您需要确保两个视图显示相同的状态,触发相同的IBActions,并且有额外的IBOutlet引用(或者在从当前IBOutlet中仔细捕获状态,然后通过从nib加载新的子视图来重新绑定状态),以便设置属性在每次轮换中的等效视图。

  4. 结合上述选项2和3,为每次旋转加载具有不同布局行为的不同视图,并在它们之间来回拖动子视图。

+0

当!我以为会有更简单的方法!尽管谢谢你的回应! – ultifinitus 2011-03-23 23:15:37

1

这是一个更简单的方法 - 两个NIB,使用苹果的命名约定。我怀疑在iOS 6或7中,Apple可能会将其添加为“功能”。我在我的应用程序使用它,它完美的作品:

  1. 会触发(直到旋转阿尼姆即将开始等待)将旋转
  2. 用来横向/纵向文件(默认苹果的命名约定。 png是Default-landscape.png,如果你想苹果自动加载风景版本)
  3. 重新加载新的NIB
  4. 重置自我。视图 - 这将自动更新显示
  5. 然后调用viewDidLoad中(苹果不会把这个给你,如果你手动重新加载NIB)

(NB stackoverflow.com这里需要这句话 - 有一个在代码格式化程序错误)

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) 
    { 
     [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])] owner:self options:nil]; 

     [self viewDidLoad]; 
    } 
    else 
    { 
     [[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", NSStringFromClass([self class])] owner:self options:nil]; 

     [self viewDidLoad]; 
    } 
}