Ios 可调整大小,然后可滚动UITextView,如电报

Ios 可调整大小,然后可滚动UITextView,如电报,ios,swift,autolayout,uitextview,Ios,Swift,Autolayout,Uitextview,我想创建UITextView,它可以像Telegram上的一样同时调整大小和滚动,Instagram或Whats应用程序,允许UITextView增长到或8行,如果添加更多文本,则可以滚动。我可以使UITextView增长到5行,但如果它们是更多文本,则由于isScroll属性被禁用,我无法看到 我的UITextView位于UIView内部,左右两侧各有两个按钮,如果可能的话,我更愿意通过Constraint完成,如果不通过代码也可以 您可以通过以下步骤实现预期结果: 将textView委托分配

我想创建UITextView,它可以像Telegram上的一样同时调整大小和滚动,Instagram或Whats应用程序,允许UITextView增长到或8行,如果添加更多文本,则可以滚动。我可以使UITextView增长到5行,但如果它们是更多文本,则由于isScroll属性被禁用,我无法看到

我的UITextView位于UIView内部,左右两侧各有两个按钮,如果可能的话,我更愿意通过Constraint完成,如果不通过代码也可以


您可以通过以下步骤实现预期结果:

将textView委托分配给控制器 默认禁用文本视图滚动 在textViewDidChange委托方法上,根据textView框架测量文本高度 为文本视图指定适当的高度,如果内容超过案例8行中的最大高度,则启用滚动 下面我附上代码片段,它可能会帮助您:

let commentViewMinHeight: CGFloat = 45.0 
let commentViewMaxHeight: CGFloat = 120.0 //In your case it should be 8 lines

func textViewDidChange(_ textView: UITextView) {
     //Calculate text height 
     let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))

     textViewHeightConstraint.constant = size.height.clamped(to: commentViewMinHeight...commentViewMaxHeight)

     if textView.contentSize.height < commentViewMaxHeight {
        textView.setContentOffset(CGPoint.zero, animated: false)
        if textView.isScrollEnabled {
           textView.isScrollEnabled = false
        }
     } else {
            if !textView.isScrollEnabled {
                textView.isScrollEnabled = true
            }
     }
} 

extension Comparable {
    func clamped(to limits: ClosedRange<Self>) -> Self {
        return min(max(self, limits.lowerBound), limits.upperBound)
    }
}

您可以通过以下步骤实现预期结果:

将textView委托分配给控制器 默认禁用文本视图滚动 在textViewDidChange委托方法上,根据textView框架测量文本高度 为文本视图指定适当的高度,如果内容超过案例8行中的最大高度,则启用滚动 下面我附上代码片段,它可能会帮助您:

let commentViewMinHeight: CGFloat = 45.0 
let commentViewMaxHeight: CGFloat = 120.0 //In your case it should be 8 lines

func textViewDidChange(_ textView: UITextView) {
     //Calculate text height 
     let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))

     textViewHeightConstraint.constant = size.height.clamped(to: commentViewMinHeight...commentViewMaxHeight)

     if textView.contentSize.height < commentViewMaxHeight {
        textView.setContentOffset(CGPoint.zero, animated: false)
        if textView.isScrollEnabled {
           textView.isScrollEnabled = false
        }
     } else {
            if !textView.isScrollEnabled {
                textView.isScrollEnabled = true
            }
     }
} 

extension Comparable {
    func clamped(to limits: ClosedRange<Self>) -> Self {
        return min(max(self, limits.lowerBound), limits.upperBound)
    }
}
的答案很好,但我想对其进行一点增强并添加一些动画:

你需要的步骤 获取文本视图的出口 添加高度约束并为其获取出口 实现textView的textViewDidChange委托方法 在textViewDidChange中 使用textView.sizeThatFitssize计算新高度 将高度约束常量设置为新高度 [可选]设置约束更改的动画,使其更便于用户使用 这里有一个例子 的答案很好,但我想对其进行一点增强并添加一些动画:

你需要的步骤 获取文本视图的出口 添加高度约束并为其获取出口 实现textView的textViewDidChange委托方法 在textViewDidChange中 使用textView.sizeThatFitssize计算新高度 将高度约束常量设置为新高度 [可选]设置约束更改的动画,使其更便于用户使用 这里有一个例子