调整 UIView 的大小以在关闭自动布局的情况下包装其内容

Posted

技术标签:

【中文标题】调整 UIView 的大小以在关闭自动布局的情况下包装其内容【英文标题】:Resize UIView to wrap it's contents with auto layout turned off 【发布时间】:2016-04-26 10:45:34 【问题描述】:

嘿,所以我在UIView 中有一个UITextView,我动态加载内容。我正在使用this solution调整文本视图的高度

我已关闭自动布局以使其正常工作(sizeToFit() 等其他解决方案无法使用自动布局开启)但是当我这样做时,即使文本视图的所有内容都被渲染,它也会溢出它的边界包含UIView

我尝试使用同样适用于其容器上的文本视图的解决方案,但没有任何作用。

似乎确实有效的一件事是:

newFrame = containerView.frame
newFrame.size.height = textView.frame.size.height
containerView.frame = newFrame

但这不是我需要的,因为我在这个容器视图中还有几个标签,所以它的高度不能与文本字段的高度相同。

有没有办法在不再次打开自动布局的情况下解决这个问题? (打开自动布局会有帮助吗?)如果打开自动布局可以解决这个问题,那么有没有办法保持文本视图的动态大小(因为打开它会破坏它)?

我对此很陌生。感谢您的帮助。

哦,我实际上是在开发一个 tvOS 应用程序,而不是 ios 应用程序。不知道这是否会有所作为。

编辑:

这是实际代码:

@IBOutlet weak var container: UIView!
@IBOutlet weak var label: UILabel!
@IBOutlet weak var text: UITextView!

override func viewDidLoad() 
    super.viewDidLoad()

    print(text.frame.origin.x, text.frame.origin.y)

    text.scrollEnabled = false

    text.text = "bla blah blah blah boo boo boo boooooo boo blah yo yo yo yo yo hello"
    let fixedWidth = text.frame.size.width
    let newSize = text.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
    var newFrame = text.frame
    newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
    text.frame = newFrame

这会在内容更改时动态扩展文本视图。添加:

newFrame = containerView.frame
newFrame.size.height = textView.frame.size.height
containerView.frame = newFrame

调整容器UIView 的大小,但将文本视图的text.frame.origin.y 设为0。因此向容器中添加任何其他元素只会与文本视图重叠。

【问题讨论】:

【参考方案1】:

您可以通过自动布局或框架来实现这一点。如果您使用框架,那么您需要考虑容器视图中所有其他组件的高度。假设您有 3 个标签,1 个在 textview 上方,2 个在其下方,有 15 个点,每个点之间有垂直距离,那么您的 containerView 高度应该是:

newFrame = containerView.frame
newFrame.size.height = 15 + label1.frame.size.height + 15 + textView.frame.size.height + 15 + label2.frame.size.height + 15 + lable3.frame.size.height + 15
containerView.frame = newFrame

使用自动布局,您必须在组件之间设置适当的垂直约束以相应地调整大小。

【讨论】:

所以我必须对不同组件之间的填充进行硬编码,并将它们加在一起?这不是很干净,对吧?我并没有真正得到垂直约束。我可以在 UIView 上使用它来动态调整大小吗? 不清楚,但在 Autolayout 之前,这只是一个选项,您可以将常量部分直接硬编码为 45。对于 Autolayout,您可以通过raywenderlich.com/110393/… 嘿,所以用填充物添加高度不起作用。结果是,将文本视图的高度分配给容器会以某种方式改变文本视图的原点,因此它将与上面的任何其他控件重叠。不知道为什么。 请用代码更新您的问题,如何设置 UI 和 textView 的动态更新

以上是关于调整 UIView 的大小以在关闭自动布局的情况下包装其内容的主要内容,如果未能解决你的问题,请参考以下文章

在不自动调整大小的情况下确定 UIView 容器大小

使用固定大小的子视图和自动布局调整 UIView 的大小不起作用

自动布局可以调整 UITableView 的大小以在 ipad 上纵向增长和横向缩小吗?

在关闭自动布局的情况下更改 UIView 的高度

使用带有修复底部 UIView 的自动布局调整 UIView 的大小

使用自动布局调整 UIView 大小并更新内容