在启用滚动的情况下在堆栈视图中扩展UITextView

时间:2017-10-26 23:45:54

标签: swift xcode autolayout uitextview uistackview

我正在尝试使用Auto Layout和Stackview实现某些功能。我有一个垂直Stackview,其中包含UIView,UITextView和UIView,如下所示。

enter image description here

我已经在这里检查了以前的答案,但找不到一个干净的解决方案来实现这一目标。

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
        }
}

实现我的目标的最佳途径是什么?

1 个答案:

答案 0 :(得分:1)

情侣笔记......

我认为您最好设置UITextView而不是UIStackView的最大高度。文本视图将根据其内容进行扩展/收缩,因此您可以设置<=高度约束。

计算&#34; elementsHeight&#34; - 顶视图和底视图使用的垂直尺寸,加上任何间距 - 并设置&#34;最大文本视图高度&#34;到视图高度减去elementsHeight ...并在可见时减去键盘高度。

当&#34;最大文本视图高度&#34;更新文本视图的高度约束常量。变化。

然后为文本视图设置观察者.contentSize ...并根据.contentSize.height启用/禁用滚动,与&#34;最大文本视图高度&#34;相比较。

需要一些跳跃,以确保在布局子视图时更新大小,并确保您不会进入递归循环。

这是我设置它的方式:

enter image description here

文本视图的初始高度约束为<= 40 - 但这并不重要,因为每次视图布局不同时,它都会通过代码进行更改。

我在GitHub上举了一个例子 - 它有效,但实际上只是一个起点。看看你是否有兴趣,然后把它拆开。 https://github.com/DonMag/ExpandingTextView