如何使用“自动布局”为纵向和横向定向configuration不同的布局?

我有一个像附图中的视图

在这里输入图像说明

现在我添加约束条件,当方向改变为横向时,视图中的UITextview必须位于屏幕的右侧。 在UItextview上,我添加了下面的约束,

  1. 尾随空间:Superview
  2. 底部空间:Superview

虽然这些限制显示了一些关于ambugity的警告,但为我做了这个工作。 以下是横向模式的截图。

在这里输入图像说明

我的问题是,虽然UItextview被移动到右侧,我想要在横向模式下超级视图顶部的一些额外的宽度。 换句话说,我希望UITextview从现在处于横向模式的位置向下移动一点。 我在思考如何在IB中使用自动布局来做这件事,而我无法想象如何。

任何build议,请。

您可以通过几种方式使用约束来实现这一点,但是您只能在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; } 

使用这些方法的方法是在故事板中添加起始画像约束,但在约束的属性检查器中选中框“占位符 – 在构build时移除”,然后将其replace为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/S4exMJBWftlCeO5GybNOfind。

另一种方法是让IBOutlets在IB中制作约束条件,并在其中一种旋转callback方法中调整它们(常量值),或者删除一些并重新创build其他条目。