[英]iOS auto layout: how to design different layouts for iPad landscape and iPad portrait in Xcode storyboard?
[英]How to configure different layouts for Portrait and Landscape Orientations using Auto Layout?
我有一个像附加图像的视图
现在我添加约束,以便当方向更改为横向时,视图中的UITextview必须位于屏幕的右侧。 在UItextview上,我添加了以下约束,
这些限制虽然显示了一些关于ambugity的警告,但是我的工作也是如此。 以下是横向模式的屏幕截图。
我的问题是虽然UItextview被移动到右侧,但是当它处于横向模式时,我想从superview顶部获得一些额外的宽度。 换句话说,我希望UITextview从现在处于横向模式的位置稍微向下移动。 我正在考虑如何在IB中使用自动布局来做到这一点,我无法弄清楚如何做到这一点。
请给我任何建议。
您可以通过多种方式使用约束来完成此操作,但只有在IB中进行限制时,无法自动执行此操作。 通过在方法中使用乘数和常量值,constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:,您可以使用一个约束来计算纵向和横向中的不同距离。 进行计算以找出用于这些值的内容是很痛苦的,所以我在NSLayoutConstraint上编写了一个类别来做到这一点。 其中一种方法的一个例子是:
+(NSLayoutConstraint *)topConstraintForView:(UIView *)subview viewAttribute:(NSLayoutAttribute) att superview:(UIView *)superview portraitValue:(CGFloat)pValue landscapeValue:(CGFloat)lValue {
CGFloat multiplier = (pValue - lValue)/(superview.bounds.size.height - superview.bounds.size.width);
CGFloat constant = pValue - (superview.bounds.size.height * multiplier);
NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:att relatedBy:0 toItem:superview attribute:NSLayoutAttributeBottom multiplier:multiplier constant:constant];
NSLog(@"top coeffs: %f %f",multiplier,constant);
return con;
}
您使用这些方法的方法是在故事板中添加起始纵向约束,但在属性检查器中选中“占位符 - 在构建时删除”框中的约束,然后在viewDidLoad中替换它,如下所示:
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addConstraint:[NSLayoutConstraint topConstraintForView:self.textView viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:225 landscapeValue:50]];
}
这将根据设备的旋转自动调整文本视图的位置,而无需任何其他代码。 您可能需要更改文本字段的宽度以使所有内容都适合 - 我将它们和视图中的“获取”标签括起来,以便更轻松地将它们定位为一个组。 该视图和文本视图具有高度和宽度约束,以及视图的顶部和左侧,以及文本视图的顶部和右侧。 该类别还有调整其他约束的方法,可以在http://jmp.sh/b/S4exMJBWftlCeO5GybNO找到。
另一种方法是将IBOutlets用于你在IB中制作的约束,并在其中一个旋转回调方法中调整它们(常量值),或者删除一些并重新制作其他的约束。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.