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

标签 ios ios7 autolayout

我有一个 View ,如附图所示

enter image description here

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

  1. 到 : Superview 的尾随空格
  2. 底部空间到:Superview

这些约束虽然显示了一些关于歧义的警告,但对我来说是有用的。下面是横屏模式的截图。

enter image description here

我的问题是,虽然 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;
}

你使用这些的方法是在 Storyboard中添加起始纵向约束,但在约束的属性检查器中选中“占位符 - 在构建时删除”框,然后在 viewDidLoad 中替换它,就像这样:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addConstraint:[NSLayoutConstraint topConstraintForView:self.textView viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:225 landscapeValue:50]];
}

这将根据设备的旋转自动调整 TextView 的位置,无需任何其他代码。您可能必须更改文本字段的宽度以使所有内容都适合——我将它们和“获取”标签包含在一个 View 中,以便更轻松地将它们定位为一个组。该 View 和 TextView 具有高度和宽度约束, View 的顶部和左侧以及 TextView 的顶部和右侧。该类别也有调整其他约束的方法,可以在 http://jmp.sh/b/S4exMJBWftlCeO5GybNO 找到。 .

另一种方法是使 IBOutlets 符合您在 IB 中所做的约束,并在其中一个旋转回调方法中调整它们(常量值),或删除一些并重新制作其他一些。

关于ios - 如何使用自动布局为纵向和横向配置不同的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683698/

相关文章:

iphone - 如何在 iOS 上以编程方式创建类似 'home screen apps folder' 的按钮?

ios - 从 CLI 运行 swift 测试时,我可以指定平台目标吗?

iphone - 应用崩溃iPhone 5s iOS 7.1.1

iphone - “缺少推荐的图标文件 - 该 bundle 不包含 .png 格式的 iPhone/iPod Touch 应用程序图标,正好是 '120x120' 像素”

ios - 尽管有约束,按钮仍超出父 View

ios - 是否可以从加载到的 View 中访问/操作 nib 文件中的约束?

ios - 如何处理 cookie 以保持用户使用 Swift 登录?

ios - 如何使用选择器方法传递多个参数

ios - 启用位码是否适用于 iOS 9(iOS 7/8)之前的 iOS 版本?

ios - 嵌入固有大小的 View 会破坏动画