iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView

Posted

技术标签:

【中文标题】iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView【英文标题】:iOS: Create UIScrollView with dynamic contentSize in Interface Builder 【发布时间】:2016-02-26 16:37:03 【问题描述】:

对于我的项目,我需要使用一个UIScrollView,它可以垂直滚动屏幕的内容。由于标签具有动态大小,因此屏幕的内容可以在屏幕外增长。

我在 Interface Builder 中做了以下操作:

-View
--UIScrollView (constraint to superview "View": 0,0,0,0) 
---UIView/contentview (constraint to superview "UIScrollView": 0,0,0,0) + equals width to root view "View" 
----subview .. 
----subview .. etc 
----Label("Some huge dynamic text")  

标签对容器视图的顶部、前导、后沿和底部边缘有约束。

但是,当我运行应用程序时,它不会为 UIScrollView 动态设置 contentSize。 我不想使用其他 Stack Overflow 帖子中创建运行时变量或视图在屏幕外变大的技巧。

如何在没有代码的情况下告诉界面构建器,UIScrollView 应该根据内容动态增长并且只能垂直滚动?

【问题讨论】:

您确定您的标签尺寸正确拉伸了吗?喜欢sizeToFit 是的,标签位于容器视图的正中心,标签上有 sizeToFit (cmd + =) 但是标签不可见,滚动视图不可滚动。 【参考方案1】:

尝试拨打label.sizeToFit()scrollView.layoutSubviews()

如果这不起作用,请尝试为您的标签添加高度约束并手动将其常量设置为您需要的大小:

let expectedSize = label.sizeThatFits(CGSize(width: scrollView.frame.size.width, height: CGFloat.max))
labelHeightConstraint.constant = expectedSize.height
self.view.layoutSubviews()

在控制器的updateViewConstraints()

【讨论】:

我尝试在 updateViewConstraints() 中调用 label.sizeToFit() 和 scrollView.layoutSubviews(),但是不会给出任何不同的结果。【参考方案2】:

以下方法成功了:

“基本上,为了让这个也能正常工作,你放在容器视图中的所有视图都必须有一个高度。一些视图将使用它们固有的内容高度,这通常由宽度决定。作为一般规则,您需要为任何不包含文本的视图指定高度和宽度。那些包含文本的视图至少应具有指定的宽度或边距。"

This 教程应该可以帮到你

【讨论】:

以上是关于iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView

iOS null Interface Builder 对象

iOS Update Interface Builder视图框架基于约束

IOS Interface Builder - 在单个视图控制器场景中管理多个视图

如何像 Interface Builder 一样调整 iOS UI 组件的大小

iOS:以编程方式更改从 Interface Builder 设置的约束