swift - 在启用滚动的堆栈 View 中扩展 UITextView

标签 swift xcode autolayout uitextview uistackview

我正在尝试使用自动布局和 Stackview 实现一些目标。我有一个带有 UIView、UITextView 和 UIView 的 Vertical Stackview,如下所示。

enter image description here

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

UITextView 是可编辑的,并且必须随着用户在其中键入内容而展开 - 为此,我在 IB 中禁用了 UITextView 的滚动。我还在 UITextView 上设置了一个高度约束设置为“大于或等于”10,并将行数设置为 0,以便 UITextView 在用户键入时在运行时采用固有高度.我还希望 UITextView 的扩展继续进行,直到 UIStackView 底部边缘到达键盘配件的顶部边缘。通过将堆栈 View 固定到 Superview 的顶部、尾部和前缘,我在一定程度上能够实现扩展的 UITextView 部分,但我一直收到 stackview 需要 Y 位置的错误或高度,这是可以理解的,但如果我给它一个固定的高度或底部约束,那么 UITextView 就不会展开。

我也不确定如何在 UITextView 到达键盘附件 View 的顶部边缘时停止它的扩展。

我目前的代码是

let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height)

基本上通过减去keyboardheight+Accessory view height就可以找到view frame中允许的高度。此计算正确发生。接下来我这样做(在 textViewDidChange 内)希望仅启用/禁用 UITextView 上的滚动会起作用,但显然不会,因为整个 TextView 会奇怪地跳转每次击键时上下移动。

func textViewDidChange(_ textView: UITextView) {
   if stackView.frame.height >= allowedHeight{
            textView.isScrollEnabled = true
        }

   if stackView.frame.height < allowedHeight{
            textView.isScrollEnabled = false
        }
}

实现我想要做的事情的最佳方式是什么?

最佳答案

几个笔记...

我认为您最好设置 UITextView 的最大高度而不是你的 UIStackView . TextView 将根据其内容扩展/收缩,因此您可以设置 <=高度限制。

计算“elementsHeight” - 顶部和底部 View 使用的垂直尺寸,加上任何间距 - 并将“最大 TextView 高度”设置为 View 高度减去 elementsHeight ...并在可见时减去键盘高度。

当“最大 TextView 高度”改变时更新 TextView 的高度约束常量。

然后为 TextView 的 .contentSize 设置一个观察者...并根据 .contentSize.height 启用/禁用滚动与“最大 TextView 高度”相比。

需要一点跳环,以确保在布局 subview 时更新大小,并确保您不会进入递归循环。

我是这样设置的:

enter image description here

TextView 的初始高度约束是 <= 40 - 但这并不重要,因为每次 View 布局不同时都会通过代码更改。

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

关于swift - 在启用滚动的堆栈 View 中扩展 UITextView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965439/

相关文章:

arrays - SwiftUI - 索引集以索引数组

ios - 两个文本字段的第一响应者

swift - cocoa swift : Connect Main Menu to Preferences Window Controller & Disabling Items like Minimise in Attributes Inspector doesn't work in Xcode?

ios - 以编程方式添加导航栏 iOS

Xcode 4 : can't select target for test scheme

iphone - 如何更改启动的默认 xcode 版本...?

xcode - 向 UIBarButtonItem 添加约束

ios - 使用可视格式语言将 View 置于其父 View 的中心

ios - 自动布局和UITableView : how to adjust for Tabbar?

swift - NSTextView 不支持 Cocoa 应用中的重做和撤消