调整 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 的大小不起作用
自动布局可以调整 UITableView 的大小以在 ipad 上纵向增长和横向缩小吗?