在启用滚动的堆栈视图中扩展 UITextView
Expanding UITextView inside a Stack View with scrolling enabled
我正在尝试使用自动布局和 Stackview 实现一些目标。我有一个带有 UIView、UITextView 和 UIView 的 Vertical Stackview,如下所示。
我在这里查看了以前的答案,但找不到一个干净的解决方案来实现这一点。
UITextView
是可编辑的,并且必须随着用户在其中键入内容而展开 - 为此,我在 IB 中禁用了 UITextView
的滚动。我还在 UITextView 上设置了一个高度限制,设置为 "Greater than or equal to" 10,行数设置为 0,以便 UITextView
在用户键入时在 运行 时间采用固有高度。我还希望继续扩展 UITextView,直到 UIStackView
底部边缘到达键盘配件的顶部边缘。我已经能够通过将堆栈视图固定到 Superview 的顶部、尾部和前缘来实现扩展 UITextView
部分,但是我不断收到一个错误 stackview needs Y position or height
这是可以理解的,但是如果我给它一个固定的高度或底部约束,然后 UITextView 就不会展开。
我也不确定如何在 UITextView 到达键盘附件视图的顶部边缘时停止扩展。
我目前的代码是
let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height)
通过减去keyboardheight+Accessory view height,基本上找到了view frame中允许的高度。此计算正确发生。接下来我这样做(在 textViewDidChange
内)希望 enabling/disabling UITextView
上的滚动会起作用,但显然不会,因为整个文本视图然后奇怪地上下跳动每一次击键。
func textViewDidChange(_ textView: UITextView) {
if stackView.frame.height >= allowedHeight{
textView.isScrollEnabled = true
}
if stackView.frame.height < allowedHeight{
textView.isScrollEnabled = false
}
}
实现我想要做的事情的最佳方法是什么?
情侣笔记...
我认为您最好设置 UITextView
的最大高度,而不是 UIStackView
。文本视图将根据其内容扩展/收缩,因此您可以设置 <=
高度限制。
计算 "elementsHeight" - 顶部和底部视图使用的垂直尺寸,加上任何间距 - 并将 "max text view height" 设置为视图高度减去 elementsHeight ... 并减去键盘高度可见。
当 "max text view height" 改变时更新文本视图的高度约束常量。
然后为文本视图的 .contentSize
设置一个 Observer ...并根据 .contentSize.height
与 "max text view height" 相比启用/禁用滚动。
需要一点点跳跃,以确保在布局子视图时更新大小,并确保您不会进入递归循环。
我是这样设置的:
文本视图的初始高度限制是 <= 40
- 但这并不重要,因为每次视图布局不同时它都会通过代码更改。
我在 GitHub 上举了一个例子——它有效,但实际上只是一个起点。有兴趣的可以看看,然后把它拆开。 https://github.com/DonMag/ExpandingTextView
我正在尝试使用自动布局和 Stackview 实现一些目标。我有一个带有 UIView、UITextView 和 UIView 的 Vertical Stackview,如下所示。
我在这里查看了以前的答案,但找不到一个干净的解决方案来实现这一点。
UITextView
是可编辑的,并且必须随着用户在其中键入内容而展开 - 为此,我在 IB 中禁用了 UITextView
的滚动。我还在 UITextView 上设置了一个高度限制,设置为 "Greater than or equal to" 10,行数设置为 0,以便 UITextView
在用户键入时在 运行 时间采用固有高度。我还希望继续扩展 UITextView,直到 UIStackView
底部边缘到达键盘配件的顶部边缘。我已经能够通过将堆栈视图固定到 Superview 的顶部、尾部和前缘来实现扩展 UITextView
部分,但是我不断收到一个错误 stackview needs Y position or height
这是可以理解的,但是如果我给它一个固定的高度或底部约束,然后 UITextView 就不会展开。
我也不确定如何在 UITextView 到达键盘附件视图的顶部边缘时停止扩展。
我目前的代码是
let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height)
通过减去keyboardheight+Accessory view height,基本上找到了view frame中允许的高度。此计算正确发生。接下来我这样做(在 textViewDidChange
内)希望 enabling/disabling UITextView
上的滚动会起作用,但显然不会,因为整个文本视图然后奇怪地上下跳动每一次击键。
func textViewDidChange(_ textView: UITextView) {
if stackView.frame.height >= allowedHeight{
textView.isScrollEnabled = true
}
if stackView.frame.height < allowedHeight{
textView.isScrollEnabled = false
}
}
实现我想要做的事情的最佳方法是什么?
情侣笔记...
我认为您最好设置 UITextView
的最大高度,而不是 UIStackView
。文本视图将根据其内容扩展/收缩,因此您可以设置 <=
高度限制。
计算 "elementsHeight" - 顶部和底部视图使用的垂直尺寸,加上任何间距 - 并将 "max text view height" 设置为视图高度减去 elementsHeight ... 并减去键盘高度可见。
当 "max text view height" 改变时更新文本视图的高度约束常量。
然后为文本视图的 .contentSize
设置一个 Observer ...并根据 .contentSize.height
与 "max text view height" 相比启用/禁用滚动。
需要一点点跳跃,以确保在布局子视图时更新大小,并确保您不会进入递归循环。
我是这样设置的:
文本视图的初始高度限制是 <= 40
- 但这并不重要,因为每次视图布局不同时它都会通过代码更改。
我在 GitHub 上举了一个例子——它有效,但实际上只是一个起点。有兴趣的可以看看,然后把它拆开。 https://github.com/DonMag/ExpandingTextView