动态 UITextView 错位行为

Dynamic UITextView mislocation behavior

我正在尝试使用类似于 iPhone 消息的文本视图,其中文本视图最初具有约束(高度 <= 100)并且 scrollEnabled = false

这是一个 link 项目: https://github.com/akawther/TextView

文本视图根据内容大小增加高度,如左图所示,直到达到100的高度,然后将scrollEnabled设置为true。在我单击右下角的 "send" 按钮之前,它工作正常,其中 textView 应该变为空并返回到原始高度并且 scrollEnabled 变为 false。中间的图像显示了单击按钮时发生的情况。当我开始打字时,textview 会向下移动,如您在右侧最后一张图片中所见。 我希望能够单击按钮并消除中间图像中显示的行为,我该如何解决这个问题?

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

@IBOutlet weak var bottomConstraint: NSLayoutConstraint!
@IBOutlet weak var messageTextView: UITextView!
@IBOutlet weak var parent: UIView!
let messageTextViewMaxHeight: CGFloat = 100


override func viewDidLoad() {
    super.viewDidLoad()

    self.messageTextView.delegate = self
}

@IBAction func Reset(sender: AnyObject) {
    messageTextView.text = ""
    messageTextView.frame.size.height = messageTextView.contentSize.height
    messageTextView.scrollEnabled = false
    self.parent.layoutIfNeeded()
}

func textViewDidChange(textView: UITextView) {
    if textView.frame.size.height >= self.messageTextViewMaxHeight {

        textView.scrollEnabled = true

    } else {
        textView.scrollEnabled = false
        textView.frame.size.height = textView.contentSize.height
    }
}

}

您可以在 github 项目中按照以下步骤复制我的问题: 1. 继续输入单词并按回车键,直到您开始看到滚动条 2.点击按钮你会看到textview变成了蓝色 容器。这是我要解决的问题!

您的问题是 UITextView 具有冲突的属性:

  • 放置在屏幕上
  • 尺寸

当您需要可调整大小的 TextView 时,限制大小会导致问题。此外,在调整 TextView 大小时,在这种情况下它的位置也会发生变化。

解决问题的替代方法:

尝试对其相对于屏幕底部的位置设置约束。当键盘出现时,您应该将 TextView 向上移动。除非您计划强制用户滚动,否则对可调整大小的 TextView 的高度设置限制是不好的做法。

希望这对您有所帮助。

如果您正在使用自动布局,您应该更新为约束而不是更新 textView.frame。尝试为您的 textView heightConstraint 创建一个 IBOutlet,然后将更新后的高度设置为它。

IBOutlet weak var textViewHeightConstraint: NSLayoutConstraint!

//calculate the height and update the constant
textViewHeightConstraint.constant = textView.contentSize.height

试试下面的代码:-

@IBAction func Reset(sender: AnyObject) {
        messageTextView.scrollEnabled = false
        messageTextView.text = ""
        messageTextView.frame.size.height = messageTextView.contentSize.height
        parent.frame.size.height = 20

    self.view.layoutIfNeeded()
}

func textViewDidChange(textView: UITextView) {
    if textView.contentSize.height >= self.messageTextViewMaxHeight {

        textView.scrollEnabled = true

    } else {

        textView.frame.size.height = textView.contentSize.height
        textView.scrollEnabled = false
    }
}