我在使用自动布局尝试实现一些非常基本的布局行为时遇到了麻烦.我的视图控制器在IB中看起来像这样:

顶部标签是标题标签,我不知道它会有多少行.我需要标题标签来显示所有文本行.我还需要另外两个标签和小图像放在标题正下方,不管它有多高.我在标签和小图像之间设置了垂直间距约束,在标题标签和超视图之间设置了顶部间距约束,在小图像和超级视图之间设置了底部间距约束.白色UIView没有高度约束,因此它应该垂直拉伸以包含其子视图.我已将标题标签的行数设置为0.
如何调整标题标签以适应字符串所需的行数?我的理解是我不能使用setFrame方法,因为我正在使用自动布局.我必须使用自动布局,因为我需要那些其他视图保持在标题标签下面(因此约束).
我怎样才能做到这一点?
我花了两天时间尝试混合和纯Autolayout方法的各种解决方案,以实现自动布局之前的简单滚动视图设置,现在它已经正式 - 我必须太愚蠢.我主要是在Storyboard中设置它(好吧,它就是这样).
所以这是我的求助.
Viewtree:
UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton
Run Code Online (Sandbox Code Playgroud)
按钮应该水平滚动(从左到右,反之亦然).有人可以请让我知道如何设置的约束来实现这个使用纯自动布局???
-
我尝试过混合方法,如下所示:
UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton
Run Code Online (Sandbox Code Playgroud)
...并根据Apple的TechNote contentview为translatesAutoresizingMaskIntoConstraints设置和设置设置固定的宽度和高度限制.使用约束设置按钮和滚动视图.这让滚动视图滚动(yay)但是唉,它滚动得太远了!据我所知,滚动宽度在某种程度上比我设置的内容视图加倍了??? !!! ???
我尝试了纯自动布局方法,包括contentview有无.所有观点都是translatesAutoresizingMaskIntoConstraints=NO,除了self.view.按钮具有固定的宽度/高度约束,并固定到滚动视图的所有四个边缘.什么都不滚动.
所以我完全不知道为什么我不能让它正常工作.非常感谢任何帮助,如果您需要任何其他信息,请询问!
更新截图与解决方案 - buttonZ约束:

编辑@ Jamie Forrest 所以解决方案结果是最后一个按钮的错误尾随约束.而不是6441,我设置的值是负数,-6441.棘手的是,在storyboard中设置值时,Pin工具栏中有两个选项:

当前画布值为负(导致无滚动),下面的选项为正(激活滚动).这意味着我不是傻瓜,但我猜至少半盲.虽然,为了我的辩护,XCode没有为"错误"设置显示错误,这有点令人不安吗?
再次编辑 现在这很有趣......将尾随值从-6441(无滚动)更改为6441启用滚动.但我的老朋友"太多内容化"又回来了,导致内容大小是应有的两倍!获取正确内容滚动的解决方案是将尾随约束设置为ZERO!当在Storyboard中工作但是查看@Infinity James的代码时,这并不明显,它应该是什么.
我对此很新.我一步一步地关注了Apple项目"HelloWorld"的Apple教程.我在iPhone 5.0模拟器中运行它并崩溃了:
2012-11-02 14:46:06.782 HelloWorld [9880:c07] *由于未捕获的异常'NSInvalidUnarchiveOperationException'终止应用程序,原因:'无法实例化名为NSLayoutConstraint的类'*首先抛出调用堆栈:(0x14a2052 0xea2d0a 0x144aa78 0x144a9e9 0x32f7d7 0x32f9af 0x32f6b7 0x23036d 0xd7e2c 0xd83a9 0xd85cb 0x38a73 0x38ce2 0x38ea8 0x3fd9a 0x10be6 0x118a6 0x20743 0x211f8 0x14aa9 0x138cfa9 0x14761c5 0x13db022 0x13d990a 0x13d8db4 0x13d8ccb 0x112a7 0x12a9b 0x1fed 0x1f15 0x1)终止调用抛出异常(lldb)
有人可以告诉我出了什么问题吗?我正在使用Xcode 4.5.
我觉得这是一个相当常见的范例,显示/隐藏UIViews,通常UILabels,取决于业务逻辑.我的问题是,使用AutoLayout响应隐藏视图的最佳方式是什么,就像它们的帧是0x0一样.以下是1-3个功能的动态列表示例.

现在我从按钮到最后一个标签有一个10px的顶部空间,当标签被隐藏时,显然不会向上滑动.到目前为止,我创建了这个约束的出口,并根据我显示的标签数量修改常量.这显然有点hacky,因为我使用负常量值将按钮向上推到隐藏的帧上.这也很糟糕,因为它不受实际布局元素的限制,只是基于其他元素的已知高度/填充的偷偷摸摸的静态计算,并且明显地与AutoLayout的构建作斗争.
我显然可以根据我的动态标签创建新的约束,但这是很多微观管理和尝试折叠一些空白的很多冗长.有更好的方法吗?更改帧大小0,0并让AutoLayout在没有约束操作的情况下完成它的工作?完全删除视图?
但老实说,只需从隐藏视图的上下文修改常量,只需要一行代码就可以进行简单的计算.重新创建新的约束 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:似乎很重.
编辑2018年2月:用UIStackViews 来看Ben的回答
我刚刚开始学习iOS的AutoLayout,并看了一下Visual Format Language.
这一切都很好,除了一件事:我只是无法在其超级视图中找到中心.
这可能与VFL有关,还是我需要自己手动创建约束?
注意:自问这个问题以来,事情已经发生了变化; 请看这里有一个很好的近期概述.
在自动布局之前,您可以通过存储框架,设置锚点和恢复框架来更改视图图层的锚点,而无需移动视图.
在自动布局世界中,我们不再设置框架,但是约束似乎不能将视图的位置调整回我们想要的位置.您可以破解约束以重新定位视图,但在轮换或其他调整大小事件时,这些会再次变为无效.
以下明智的想法不起作用,因为它创建了"无效的布局属性配对(左侧和宽度)":
layerView.layer.anchorPoint = CGPointMake(1.0, 0.5);
// Some other size-related constraints here which all work fine...
[self.view addConstraint:
[NSLayoutConstraint constraintWithItem:layerView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:layerView
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:20.0]];
Run Code Online (Sandbox Code Playgroud)
在这里我的目的是左边缘设置layerView,调整后的定位点来看,它的宽度加上20(我从上海华盈的左边缘要插入的距离)的一半.
是否可以在使用自动布局布局的视图中更改定位点而不更改视图的位置?我是否需要使用硬编码值并在每次旋转时编辑约束?我希望不是.
我需要更改锚点,以便在将变换应用于视图时,我获得正确的视觉效果.
我有一个完全使用自动布局编程的视图.我在视图中间有一个UITextView,上面和下面有项目.一切正常,但我希望能够在添加文本时扩展UITextView.当它扩展时,它应该将其下面的所有内容都推下来.
我知道如何以"弹簧和支柱"的方式做到这一点,但是有一种自动布局方式吗?我能想到的唯一方法是每次需要增长时删除并重新添加约束.
什么是利用iOS 6的新自动布局功能同时仍然在早期版本的iOS上提供旧设备兼容性的最佳方式?
我应该如何以编程方式(以及在哪种方法中)配置UILabel,其高度取决于其文本?我一直在尝试使用Storyboard和代码的组合进行设置,但无济于事.每个人都建议sizeToFit在设置lineBreakMode和numberOfLines.但是,不管我把代码viewDidLoad:,viewDidAppear:或者viewDidLayoutSubviews我不能让它开始工作.要么我的盒子太小而不能长文本也不会长,或者我把它做得太大而且不会缩小.
我对自动布局的理解是,它采用超视图的大小,并以约束和内在大小为基础计算子视图的位置.
有没有办法扭转这个过程?我想在约束和内在大小的基础上调整superview的大小.实现这一目标的最简单方法是什么?
我有在Xcode中设计的视图,我用它作为标题UITableView.该视图包括标签和按钮.标签的大小因数据而异.根据约束条件,标签成功按下按钮,或者如果按钮和superview底部之间存在约束,则标签将被压缩.
我找到了一些类似的问题,但他们没有很好的答案.
autolayout ×10
ios ×10
ios6 ×2
objective-c ×2
uilabel ×2
calayer ×1
cocoa-touch ×1
ios5 ×1
iphone ×1
layout ×1
storyboard ×1
uiscrollview ×1
uitableview ×1
uitextview ×1