如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?
Posted
技术标签:
【中文标题】如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?【英文标题】:How to automatically have content size increase in UIScrollView on an action with autolayout? 【发布时间】:2016-09-07 21:56:40 【问题描述】:我已经为此问题设置了一个测试项目 (project here) 以更好地说明我的问题,但这是我面临的核心问题:
我有一个 UILabel
嵌套在一个内容 UIView
中,它本身嵌套在一个 UIScrollView
中,这一切都是用 AutoLayout 布置的。我的初始布局效果很好,并且标签被适当地截断以适应初始布局约束所需的内容视图。到目前为止一切都很好。
现在的问题是我想在标签上添加“展开”操作。假设在内容视图上的任何点击都应该扩展标签,以便不再截断,而不是在 contentView
的范围内截断,我希望 scrollView
的 contentSize
增加,以便完整标签的现在可以滚动文本。我应该如何做到这一点?
在示例项目中,点击内容视图将调整整个scrollView
的约束,只是为了说明标签现在有不同的空间可以使用。我不知道现在如何让scrollView
重新计算它的contentSize
,这样标签就不再被截断。
我尝试过使用内容压缩优先级,并根据正在执行的操作进行更改,如下所示:
theLabel.setContentCompressionResistancePriority(UILayoutPriorityRequired, forAxis: .Vertical)
但这似乎并没有真正强制标签不会被截断。我还尝试在点击操作上使scrollView
的内在内容大小无效,但无济于事。如何切换标签是否应截断?
【问题讨论】:
【参考方案1】:通常,您有一个约束,它将标签或视图的高度固定到您的最小高度,当您想要扩展时,您禁用它(使其处于非活动状态)并布局视图。压缩重新启用约束和布局视图。
【讨论】:
不确定这如何回答我的问题。如果我有一个最小高度约束,然后在展开时将被禁用,我仍然看不出这将如何解决滚动视图内容大小不会增加以匹配标签高度(如果它不被截断)的问题。我成功地在其父内容视图旁边扩展了标签大小,但是如何强制标签不会截断?您建议手动计算全高并为此设置约束? 不,标签具有固有的内容大小,最小高度约束将覆盖它或使其生效。如果您已将视图固定到滚动视图的边缘和宽度,则在约束更改后布局视图会更新内容大小。 仍然不确定这是如何回答我的问题的。我的UILabel
最初在折叠状态下通过对其内容视图的上/左/右/下一组约束正确调整大小。当我将内容视图的父级(滚动视图)的约束更新为“扩展”时,我看到标签没有更新内容大小的问题......我真的很难知道这是如何解决这个问题的问题
为什么要更新滚动视图大小?滚动视图的大小和标签的大小实际上是不相关的。您通常会固定宽度以匹配并计算高度。扩展应该在标签上,因为它是您拥有的唯一具有内在内容大小的视图。
我得到了这个工作。您的回答更像是一路上的提示,所以我将详细说明我所缺少的内容:在示例项目中,我的 contentView 有中心 x/y 约束以“让 IB 开心”。我发现相反,我应该删除这些并将我的 contentView 的宽度固定到 scrollView 父级的宽度,高度也是如此。正如您所建议的,此高度限制是我随后根据需要激活/停用的限制。这实现了我正在寻找的确切行为。在这种情况下,标签的约束始终保持不变——固定到 contentView。谢谢!以上是关于如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 具有自动布局的错误 contentSize
如何使用自动布局在 iOS 中根据文本长度更改 UILabel 宽度