繁体   English   中英

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

[英]How to configure different layouts for Portrait and Landscape Orientations using Auto Layout?

我有一个像附加图像的视图

在此输入图像描述

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

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

这些限制虽然显示了一些关于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM