AutoLayout:垂直到水平,没有明确的尺寸?

Posted

技术标签:

【中文标题】AutoLayout:垂直到水平,没有明确的尺寸?【英文标题】:AutoLayout: Vertical to horizontal with no explicit sizes? 【发布时间】:2014-08-05 23:48:06 【问题描述】:

我对完成这类事情很感兴趣,最好只使用 AutoLayout 而没有代码:

以下是我需要维护的约束:

没有明确的视图大小,因为应该支持 iPhone 和 iPad。 视图 1 保持其方形纵横比。 视图 2 占用所有剩余空间(垂直或水平)并调整其子视图的大小。 旋转时,从垂直对齐更改为水平对齐。

我将不胜感激有关如何完成此类事情的任何建议。对于这类任务,AutoLayout 似乎有点令人困惑。

非常感谢!

附: - 作为一个更复杂的后续,你认为这样的事情可以实现吗?我有点怀疑。

【问题讨论】:

【参考方案1】:

使用自动布局绝对可以实现所有这些。它只需要一些代码!

解决每个要点:

这就是 AutoLayout 的全部意义所在。根据您的实施,您实际上应该很难不让它同时在 iPad 和 iPhone 上运行。

没问题

[view1 addConstraint:[NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view1 attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];

当然可以

UIView *view1;
UIView *view2;
UIView *superview;
NSDictionary *metrics = @@"border":@(VIEW1_BORDER);
NSDictionary *views = NSDictionaryOfVariableBindings(view1,view2);
UIDeviceOrientation orientation = [[UIDevice currentDevice]orientation];
if (UIDeviceOrientationIsPortrait(orientation)) 
    [superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[view1]-(border)-[view2]|" options:0 metrics:metrics views:views]];
    [superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view2]|" options:0 metrics:nil views:views]];
 else 
    [superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[view1]-(border)-[view2]|" options:0 metrics:metrics views:views]];
    [superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view2]|" options:0 metrics:nil views:views]];

实现 UIViewController willRotateToInterfaceOrientation:duration: 方法并使用与上面相同的代码。只需确保在添加新约束之前删除任何先前添加的约束,以避免冲突约束。 更新: 由于 willRotateToInterfaceOrientation:duration:ios 8 中已弃用,您可以观察默认的 NSNotificationCenter UIApplicationWillChangeStatusBarOrientationNotification 和 UIApplicationDidChangeStatusBarOrientationNotification 处理方向变化的通知。

使用三个视图与上面的代码几乎完全相同。

【讨论】:

您通过将边框格式化为可视格式语言字符串所做的工作就是 metrics 字典的用途。 感谢您的回答和示例代码。因此,基本上,这里的要点是以编程方式定义两组不同的约束——一组用于水平布局,一组用于垂直布局?我希望这只能通过使用 Interface Builder 并且只有一组约束来实现。现在看,我认为这样可能更直观。我会再等几天看看是否还有更多回复,然后将其标记为已接受。再次感谢! 我会说在代码中执行此操作会容易得多,甚至可能是一个要求。在您的 2 视图场景中,如果 view2 始终保持在 view1 以下,那么您可以在 IB 中完成所有这些操作。由于 view2 在横向模式下移动到 view1 的右侧,因此需要对两个方向使用不同的约束。我认为 IB+AutoLayout 在您只需要担心调整视图大小时很棒,当您还需要动态布局时就不那么好了。

以上是关于AutoLayout:垂直到水平,没有明确的尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

Autolayout-处理七个按钮的圆形,不影响前导、尾随、垂直和水平间距

图像视图autolayout从水平边缘固定到60pt,但自动刻度高度?

Xamarin iOS Autolayout:自动调整各种设备的宽度和垂直滚动,同时保持水平滚动禁用演示链接

AutoLayout正确定位按钮

如何使用 autoLayout 创建具有水平和垂直分页的强大 ScrollView?

在另一个没有尺寸的情况下垂直/水平居中图像