我正在尝试使用Auto Layout和Stackview实现某些功能。我有一个垂直Stackview,其中包含UIView,UITextView和UIView,如下所示。
我已经在这里检查了以前的答案,但找不到一个干净的解决方案来实现这一目标。
UITextView
是可编辑的,必须在用户输入时进行扩展 - 为此,我已禁用IB中UITextView
的滚动条。我还在UITextView上设置了一个高度约束设置为“大于或等于”10和设置为0的行数,以便UITextView
在用户键入时在运行时获取内在高度。我还希望UITextView的扩展能够继续,直到UIStackView
底边到达Keypad附件的顶边。我有点能够实现扩展UITextView
部分,我的堆栈视图固定在Superview的顶部,尾部和前沿,但我不断收到错误,stackview needs Y position or height
这是可以理解的,但如果我给它一个固定的高度或底部约束,然后UITextView根本不会扩展。
我也不确定如何在UITextView到达键盘配件视图的顶部边缘时停止扩展。
到目前为止我的代码是
let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height)
通过减去keyboardheight + Accessory视图高度,基本上在视图框架中找到允许的高度。此计算正确发生。接下来我这样做(在textViewDidChange
内)希望只是启用/禁用UITextView
上的滚动会起作用但是它显然不会因为整个文本视图然后奇怪地用每个键上下跳跃行程。
func textViewDidChange(_ textView: UITextView) {
if stackView.frame.height >= allowedHeight{
textView.isScrollEnabled = true
}
if stackView.frame.height < allowedHeight{
textView.isScrollEnabled = false
}
}
实现我的目标的最佳途径是什么?
答案 0 :(得分:1)
情侣笔记......
我认为您最好设置UITextView
而不是UIStackView
的最大高度。文本视图将根据其内容进行扩展/收缩,因此您可以设置<=
高度约束。
计算&#34; elementsHeight&#34; - 顶视图和底视图使用的垂直尺寸,加上任何间距 - 并设置&#34;最大文本视图高度&#34;到视图高度减去elementsHeight ...并在可见时减去键盘高度。
当&#34;最大文本视图高度&#34;更新文本视图的高度约束常量。变化。
然后为文本视图设置观察者.contentSize
...并根据.contentSize.height
启用/禁用滚动,与&#34;最大文本视图高度&#34;相比较。
需要一些跳跃,以确保在布局子视图时更新大小,并确保您不会进入递归循环。
这是我设置它的方式:
文本视图的初始高度约束为<= 40
- 但这并不重要,因为每次视图布局不同时,它都会通过代码进行更改。
我在GitHub上举了一个例子 - 它有效,但实际上只是一个起点。看看你是否有兴趣,然后把它拆开。 https://github.com/DonMag/ExpandingTextView