所以我正在设置我的应用程序轮换,并且我一直在使用以下方法手动设置所有按钮翻译:
-(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)];
}
}
我在两个方向上设置每个对象的位置。这似乎是实现我的目标的可怕方式..
所以现在我要做的是复制我的主笔尖,并在新笔尖上设置所有按钮在横向上的位置。然后当设备旋转时,调用相应的笔尖。这是可行的/可行的/可行的吗?
我如何调用笔尖进行旋转?我可以使用具有相同IB连接的完全相同的对象吗?
有更好的方法吗?
答案 0 :(得分:3)
我根据我需要的行为使用了几种不同的方法。看看哪种方式最适合你。
查找一组允许您仅使用autoresizingMask
和autoresizesSubviews
支持两种方向的规则。
为父视图的-layoutSubviews
查找一组规则,以便可以相对于父视图的边界重新排列子视图。这比自动化更多的工作,但比每个子视图的两个硬编码位置更好。这通常需要创建更深层次的视图层次结构,以嵌套具有不同-layoutSubviews
行为的多个视图,以便在可见子视图周围获得适当的定位和间距。
有两个子视图,每个方向一个。旋转时隐藏一个。这允许在子视图之间进行自定义转换,如果加载新的笔尖并替换根视图,则无法获得这些转换。如果从它自己的笔尖加载每个子视图,则可以卸载不再可见的任何子视图以减少内存使用。然后,您需要确保两个视图显示相同的状态,触发相同的IBAction,并具有额外的IBOutlet引用(或者在通过从nib加载新的子视图重新绑定它们之前仔细捕获当前IBOutlet中的状态),这样您就可以设置属性每次轮换的等效视图。
将上面的选项2和3结合起来,为每个轮换加载不同的布局行为的不同视图,并在它们之间来回移动子视图。
答案 1 :(得分:1)
这是一种更容易的方式 - 两个NIB,使用Apple的命名约定。我怀疑在iOS 6或7中,Apple可能会将其添加为“功能”。我在我的应用程序中使用它并且它完美运行:
(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];
}
}