如何使用自动布局为纵向和横向方向配置不同的布局?

时间:2013-12-19 14:01:56

标签: ios ios7 autolayout

我有附图中的视图

enter image description here

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

  1. 追踪空间:Superview
  2. 底部空间:Superview
  3. 这些限制虽然显示了一些关于ambugity的警告,但是我的工作做了。以下是横向模式的屏幕截图。

    enter image description here

    我的问题是虽然UItextview被移动到右侧,但是当它处于横向模式时,我想从superview顶部获得一些额外的宽度。换句话说,我希望UITextview从现在处于横向模式的位置稍微向下移动。我正在考虑如何在IB中使用自动布局来做到这一点,我无法弄清楚如何。

    请提出任何建议。

1 个答案:

答案 0 :(得分:5)

您可以通过多种方式使用约束来实现此目的,但只有在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中制作的约束,并在其中一个旋转回调方法中调整它们(常量值),或者删除一些并重新制作其他的约束。

相关问题