我有一个完全使用自动布局编程的视图.我在视图中间有一个UITextView,上面和下面有项目.一切正常,但我希望能够在添加文本时扩展UITextView.当它扩展时,它应该将其下面的所有内容都推下来.
我知道如何以"弹簧和支柱"的方式做到这一点,但是有一种自动布局方式吗?我能想到的唯一方法是每次需要增长时删除并重新添加约束.
UIView的内容抗压性和内容拥抱是什么?这些与视图的内在内容大小有何关系?
我正在尝试使用自动布局约束来自动调整视图中几个类似大小的按钮,以产生以下效果:
在调整大小之前

调整大小后的预期效果

你可以告诉我,我希望按钮的大小相同,我也希望每个按钮之间的间距是20分.起初看起来很简单,所以我设置了以下约束:
调整大小后实际发生了什么

在预览中或当我在iPhone /模拟器中测试运行应用程序时,按钮会调整大小,甚至不会遵循我为其设置的相同宽度约束.实际上,包含视图的视图也会调整大小以适应新的按钮大小.任何人都知道如何在界面构建器中完全解决这个问题?
因此,当我只有一个标签根据字符串的长度更改高度时,我可以使用自动布局设置动态高度大小.我的问题是,如果我添加另一个应该做同样的UILabel,事情就不会有效.
我将内容拥抱优先级和压缩阻力设置为1000 = =我得到歧义警告
如果我将第二个UILabel的内容拥抱(垂直)设置为999或250,那么它的效果很好但仅当第二个标签有2行或更多行时才能正常工作.如果第二个标签为空或只有一行,则heightForRowAtIndexPath systemLayoutSizeFittingSize:UILayoutFittingCompressedSize高度返回较大的值,并且单元格具有较大的空格.
我也玩过内在尺寸:默认或占位符(有几个高度和宽度),但它也没有帮助.
有什么建议可以做什么?
我有一个专为iPhone SE设计的ViewController
如你所见,我也有一个约束 Align Top to: Safe Area Equals 75
问题是,是否可以为iPhone 8和iPhone 8 Plus更改此值?例如:
我有标签约束的问题.
我的目标是在tableViewCell的同一Y坐标上有2个标签.其中一个标签固定在左侧,另一个标签固定在右侧.
像那样:
[This is the first label] [Second]
Run Code Online (Sandbox Code Playgroud)
第一个标签应该具有基于它必须显示的文本的动态宽度,但它应该结束大约20个点到第二个标签.
我尝试了很多约束,但有时第一个标签似乎将第二个标签推出视图,有时第一个标签只是重叠第二个标签,如下例所示:
第一个标签有以下限制:
Top Space to Superview
Leading Space to Superview
Bottom Space to a third label
Trailing Space to THE second Label (<= 20)
Run Code Online (Sandbox Code Playgroud)
正确显示两个标签的正确方法是什么?
在此先感谢,感谢您的帮助!
编辑
通过为第二个标签提供最大宽度来尝试解决方案.现在,它随机工作或不工作.我根本没有得到这个.
我试图实现简单NSView的堆叠排列,为此我使用绑定到字典控制器的NSCollectionView.我到目前为止的结果如下:

左侧的标签绑定到控制器项键,SegmentedControl selectedIndex绑定到项值.
问题是,我不知道如何强制NSCollectionView中的子视图符合容器宽度; 发生的是,它们保持自己的宽度,当NSCollectionView变得太窄时,出现水平滚动条,如下所示:

我知道这个问题(以及"反向",这个问题),而且我从来没有在Autolayout上做过太多事情而不是琐碎的事情.我想知道,凭借AutoLayout带来的所有功能,有没有办法解决这个问题,而无需使用编码和使用事件/通知?(我知道观察NSViewFrameDidChangeNotification是另一种选择,对吧?)
谢谢
我试图了解拥抱和抗压力是如何起作用的.
我有这种情况,我需要左边的两个标签(绿色容器内)和右边的两个标签(蓝色容器内).
如图所示,我希望绿色容器拥抱内容(Android's wrap content)和蓝色容器以填充剩余空间(Android's fill_parent).
我想我可以在绿色视图中添加拥抱/压缩优先级,例如:
greenView.setContentHuggingPriority(
UILayoutPriorityDefaultHigh, forAxis: .Horizontal)
greenView.setContentCompressionResistancePriority(
UILayoutPriorityDefaultHigh, forAxis: .Horizontal)
Run Code Online (Sandbox Code Playgroud)
但似乎它没有按预期工作.我必须将这些约束应用于(红色和黄色)标签.
谁知道原因?
一些想法(编辑):
根据Ken的回答,您必须将拥抱/压缩设置为标签而不是容器视图.
在这个问题的例子中,我会设置一个拥抱750(高)和1000(必需)的阻力到左边的标签.由于标签的默认值为251(低+ 1)和750(高)的阻力,因此左侧标签(750> 251和1000> 750)的拥抱和压缩将更大.同时,压缩将大于标签内的拥抱(1000> 750).
这样,左侧的标签将尝试拥抱其内容,但不会压缩它.例如,红色标签无法完全包裹其内容,因为黄色标签不想压缩.
唷!
我创建了一个具有以下约束的矩形:
我虽然如果我使用width >=250to将优先级设置为约束999,那么宽度equal == 200将适用于小型设备,并且width >= 250于大型设备。
但它不起作用。我阅读了文档:
在解决了所需的约束之后,Auto Layout 尝试按照从高到低的优先级顺序解决所有可选的约束。如果它无法解决可选约束,它会尝试尽可能接近所需的结果,然后移动到下一个约束。
这种不平等、平等和优先级的组合为您提供了大量的灵活性和权力。通过组合多个约束,您可以定义随着用户界面中元素的大小和位置变化而动态适应的布局。
我在视图中有一个按钮.我在界面构建器中为我的按钮设置了图像.我在界面构建器中添加到按钮的约束是:
正确的超视空间= 10
顶级空间到superview = 10
底部空间到superview> = 10
将空格留给标签> = 10
一切正常,我的布局没问题.但是当我使用以下代码记录按钮约束时:
NSLog(@"constraints for btnBack is: %@", self.btnBack.constraints);
Run Code Online (Sandbox Code Playgroud)
控制台日志:
constraints for btnBack is:(
"<NSContentSizeLayoutConstraint:0x7c35c400 H:[UIButton:0x7c3588a0(102)] Hug:250 CompressionResistance:750>"
"<NSContentSizeLayoutConstraint:0x7c35c450 V:[UIButton:0x7c3588a0(92)] Hug:250 CompressionResistance:750>")
Run Code Online (Sandbox Code Playgroud)
我知道顶部和左右和底部约束不应该在这里记录,因为它们是超视图约束而不是按钮约束.但在这里我没有添加任何宽度和高度约束到我的按钮(即使在代码中).
为什么在控制台中记录约束高度和宽度?
ios ×9
autolayout ×8
cocoa-touch ×3
cocoa ×1
iphone ×1
objective-c ×1
size-classes ×1
uilabel ×1
uitableview ×1
uitextview ×1
uiview ×1
xcode ×1