gpt4 book ai didi

ios - UITextView 高度在输入/不使用 Storyboard 时动态变化

转载 作者:搜寻专家 更新时间:2023-10-31 21:52:51 24 4
gpt4 key购买 nike

我有这个 UITextView,我希望它的高度在用户输入时动态变化。我想以编程方式进行。我的 UITextView 位于另一个 UIView 之上。约束设置如下:

 addtextview.leadingAnchor.constraint(equalTo: addtasktextview.leadingAnchor, constant: 8).isActive = true
addtextview.trailingAnchor.constraint(equalTo: addtasktextview.trailingAnchor, constant: -8).isActive = true
addtextview.topAnchor.constraint(equalTo: addtasktextview.topAnchor, constant: 8).isActive = true
addtextview.bottomAnchor.constraint(equalTo: addtasktextview.bottomAnchor, constant: -40).isActive = true

有趣的是,我也在 tableViewCells 中使用 textview 并通过仅使用此约束方法动态更改高度,但在这里它不起作用。我希望 textview 的高度以向上移动的方式增加。因此,当新行开始时,顶部应移动以保持下方的间距。

我该怎么做?帮助将不胜感激。

enter image description here

更新:我能够使用下面@upholder-of-truth 的回答让它工作。我还能够通过找到 textview 正常高度和 newSize.height 之间的差异然后将该差异添加到容器的高度来动态更改父 UIView 容器高度。

最佳答案

首先确保您的类采用 UITextViewDelegate 协议(protocol),这样当文本发生如下变化时您可以得到通知:

class MyClass: UIViewContoller, UITextViewDelegate

接下来在您的类中的某处定义此变量,以便您可以跟踪约束中的高度:

var textHeightConstraint: NSLayoutConstraint!

接下来添加以下约束并激活它:

    self.textHeightConstraint = addtextview.heightAnchor.constraint(equalToConstant: 40)
self.textHeightConstraint.isActive = true

(如果您不在 viewDidLoad 中执行此操作,则需要将 textHeightConstraint 设为可选)

下一步订阅委托(delegate)(如果还没有完成的话):

addTextView.delegate = self

添加重新计算高度约束的函数:

func adjustTextViewHeight() {
let fixedWidth = addtextview.frame.size.width
let newSize = addtextview.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
self.textHeightConstraint.constant = newSize.height
self.view.layoutIfNeeded()
}

接下来在创建约束以设置初始大小后添加对该函数的调用:

self.adjustTextViewHeight()

最后添加这个方法来在文本变化时调整高度:

func textViewDidChange(_ textView: UITextView) {
self.adjustTextViewHeight()
}

以防万一,这里有一个 UIViewController 的子类中的最小示例:

class ViewController: UIViewController, UITextViewDelegate {
@IBOutlet var textView: UITextView!
@IBOutlet var textHolder: UIView!

var textHeightConstraint: NSLayoutConstraint!

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
textView.leadingAnchor.constraint(equalTo: textHolder.leadingAnchor, constant: 8).isActive = true
textView.trailingAnchor.constraint(equalTo: textHolder.trailingAnchor, constant: -8).isActive = true
textView.topAnchor.constraint(equalTo: textHolder.topAnchor, constant: 8).isActive = true
textView.bottomAnchor.constraint(equalTo: textHolder.bottomAnchor, constant: -40).isActive = true

self.textHeightConstraint = textView.heightAnchor.constraint(equalToConstant: 40)
self.textHeightConstraint.isActive = true

self.adjustTextViewHeight()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func textViewDidChange(_ textView: UITextView) {
self.adjustTextViewHeight()
}

func adjustTextViewHeight() {
let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
self.textHeightConstraint.constant = newSize.height
self.view.layoutIfNeeded()
}
}

关于ios - UITextView 高度在输入/不使用 Storyboard 时动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48157212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com