如何动态地将TextView高度更改为阈值,然后允许滚动?

use*_*427 4 scroll uitextview ios swift

我有一个TextView,它具有最小高度为33的约束.从故事板中禁用滚动.TextView应根据内容增加高度,直到达到100的最大高度.然后我将scrollEnabled更改为true,将TextView的高度更改为最大高度100,但高度更改为33.如何修复这个问题?

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

@IBOutlet weak var messageTextView: UITextView!
let messageTextViewMaxHeight: CGFloat = 100

override func viewDidLoad() {
    super.viewDidLoad()
    self.messageTextView.delegate = self
}

func textViewDidChange(textView: UITextView) {

    if textView.frame.size.height >= self.messageTextViewMaxHeight {
        textView.scrollEnabled = true
        textView.frame.size.height = self.messageTextViewMaxHeight
    } else {
        textView.scrollEnabled = false
    }
}
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Jig*_*287 7

看来你的代码需要两个更改,它会正常工作.

  1. 而不是最小约束高度提供最大高度100:

TextView的高度约束

  1. 更改代码如下:

     import UIKit
    
    class ViewController: UIViewController, UITextViewDelegate
    {
        @IBOutlet weak var messageTextView: UITextView!
    
        let messageTextViewMaxHeight: CGFloat = 100
        override func viewDidLoad()
        {
            super.viewDidLoad()
            messageTextView.delegate = self
        }
    
        func textViewDidChange(textView: UITextView)
        {
            if textView.contentSize.height >= self.messageTextViewMaxHeight
            {
                textView.scrollEnabled = true
            }
            else
                {
                textView.frame.size.height = textView.contentSize.height
                textView.scrollEnabled = false // textView.isScrollEnabled = false for swift 4.0
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


war*_*rdw 5

这遵循与接受的答案类似的方法,但确保textView在两种高度状态下都受到完全约束。

(在接受的答案中有一个错误 - 使用具有<=关系的高度约束不足以完全约束textView启用滚动时的,因为在这种情况下,视图提供 no intrinsicContentSize。您可以在 IB(禁用滚动)中看到这一点,或在通过视图调试运行时。)

这是所有必要的:

// In IB, set the relation to `=` and the constant to your desired threshold point
// Notice this is a strong reference (since the constraint may get deactivated) 
@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!

func textViewDidChange(textView: UITextView)
{       
    let isOversize = textView.contentSize.height >= textViewHeightConstraint.constant
    textViewHeightConstraint.isActive = isOversize
    textView.isScrollEnabled = isOversize
}
Run Code Online (Sandbox Code Playgroud)

无需手动设置帧,因为在这两种情况下,自动布局都涵盖了我们。