Swift 3:UITextView - 动态高度 - 以编程方式

Posted

技术标签:

【中文标题】Swift 3:UITextView - 动态高度 - 以编程方式【英文标题】:Swift 3: UITextView - Dynanmic height - Programmatically 【发布时间】:2018-02-18 08:10:43 【问题描述】:

我有一个keyboardContainer 类(UIView 的子类/以编程方式创建,因此没有情节提要),包括一个供用户输入消息的UITextView。它在聊天日志类中使用并设置为inputAccessoryView。我想在用户输入时动态改变它的高度。

我搜索了一些答案并找到了一些答案。但是,我没有得到其中的大部分,因为它们不适合我。

我必须实施什么才能获得我想要的效果?

感谢您的帮助!

编辑:

首先感谢您的帮助!

但是,我对编码很陌生,所以我无法解决这个问题。我想这与我创建keyboardContainer 类及其约束的方式有关......

这是我的键盘容器类中的相关代码:

 let textField:UITextView = 
    let view = UITextView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.layer.cornerRadius = 15
    view.layer.masksToBounds = true
    view.font = UIFont.systemFont(ofSize: 15)
    view.backgroundColor = .white
    return view
()

overried init(frame: CGRect)
super.init(frame: frame)

addSubview(textField)
    textField.leftAnchor.constraint(equalTo: leftButton, constant: 5).isActive = true
    textField.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

    textFieldHeightAnchor = textField.heightAnchor.constraint(equalTo: heightAnchor, constant: -10)
    textFieldHeightAnchor.isActive = true

    textFieldRightAnchor = textField.rightAnchor.constraint(equalTo: rightAnchor, constant: -85)
    textFieldRightAnchor.isActive = true

在我的 ChatLog 中,我正在使用这个:

 lazy var keyboard: KeyboardContainer = 
    let key = KeyboardContainer()
    key.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 45)
    key.sendButton.addTarget(self, action: #selector(handleSend), for: .touchUpInside)
    return key
()

override var inputAccessoryView: UIView?
    get
        return keyboard
    

我需要改变什么?我猜是约束?

【问题讨论】:

@khtm125 在输入 UITextView 时更改高度不是必需的。文本视图是滚动视图的子类。 如果用户写的多于一行,我希望 textView 不仅仅显示一行消息。 【参考方案1】:

您可以使您的 textView 符合 UITextViewDelegate,然后将其调整为它的 contentSize。

使您的视图控制器符合委托

class ViewController: UIViewController, **UITextViewDelegate**  ... 

之后

yourTextView.delegate = self // put that in viewDidLoad()

然后你可以实现 textViewDidChange 方法。这意味着,每次您在键盘上输入内容时,都会调用此函数。

func textViewDidChange(_ textView: UITextView) 


if textView == youTextView 

    let currentHeight = textView.frame.size.height

    textView.frame.size.height = 0 // you have to do that because if not it's not working with the proper content size

    textView.frame.size = textView.contentSize // here you detext your textView's content size and make it resize.

    let newHeight = textView.frame.size.height

    let heightDifference = newHeight - currentHeight // get the height difference from before and after editing

    yourContainerView.frame.size.height += heightDifference


【讨论】:

感谢您的回答!它对我不起作用,所以我编辑了我的问题......你知道如何解决这个问题吗?【参考方案2】:

只需禁用滚动即可。不要设置任何其他约束。这可能会对您有所帮助。

在你的 viewDidLoad 方法中,

    YourTextView.translatesAutoresizingMaskIntoConstraints = true
    YourTextView.sizeToFit()
    YourTextView.isScrollEnabled = false
    YourTextView.delegate = self
    YourTextView.isEditable = true

然后使用 UITextViewDelegate 和,

func textViewDidChange(_ textView: UITextView) 

    MyTextView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 100)
    MyTextView.translatesAutoresizingMaskIntoConstraints = true
    MyTextView.sizeToFit()
    MyTextView.isScrollEnabled = false


这是在更改之前,

这是之后,

【讨论】:

这实际上不会改变 textView 的大小。 @MattHarris 它确实有效。检查随附的屏幕截图。【参考方案3】:

如果您正在寻找 UITextView 喜欢的消息应用程序。 无需再处理代码,您可以使用约束对其进行管理。 使用约束而不是处理更多编码是更好的方法。

这里是一步一步的解释。

步骤:1

UItextViewUIBUtton 排列在一个UIView 中,并以低优先级为UIView 提供高度限制。

步骤:2

还使用大于或等于为UITextView 提供高度限制。如图所示。

步骤:3

现在你只需要处理contentSizeisScrollEnabled 如下sn-p。

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool
if (textView.contentSize.height < 150)
    textView.isScrollEnabled = false
   
   else
     textView.isScrollEnabled = true
   
  return true

希望对你有帮助!!

【讨论】:

以上是关于Swift 3:UITextView - 动态高度 - 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift - 动态增加 UITextView 和父 UIView 的高度

我将如何(以编程方式)将 UITextView 的高度设置为其在 Swift 中的内容大小?

swift,如何使表格视图单元格具有动态高度[重复]

textView Swift 的动态单元格高度

UITableview swift中的UITextview高度

iOS UITextView自适应高度UITextContainerView抖动问题