textViewDidChange 仅在键入完整字符串时发生变化。我想让它检查每个字符
textViewDidChange is only changing when a full string is typed. I want it to check every character
我有一个 UITextView,当输入超出其框架边界的文本时,它会动态改变高度。但是,只有在键入完整字符串并按下 space 后,高度才会改变。这留下了一个尴尬的时刻,用户看不到他们正在输入的单词。
如何让我的 textViewDidChange
对输入的每个字符做出反应,而不是在输入完整字符串时做出反应?
这是初始化变量:
lazy var descriptionTextView: UITextView = {
let tv = UITextView()
tv.backgroundColor = .white
tv.font = UIFont.systemFont(ofSize: 18)
tv.frame = CGRect(x: 0, y: 0, width: 200, height: 40)
tv.translatesAutoresizingMaskIntoConstraints = false
tv.delegate = self
tv.isScrollEnabled = false
return tv
}()
然后我将它添加到子视图并将其锚定在我的 viewDidLoad
:
view.addSubview(descriptionTextView)
descriptionTextView.anchor(top: privacyLabel.bottomAnchor, left:
view.leftAnchor, bottom: descriptionTextViewUnderLine.topAnchor, right: view.rightAnchor, paddingTop: 16, paddingLeft: 24, paddingBottom: 0, paddingRight: 24, width: 0, height: 40)
在扩展中,我输入了textViewDidChange
func textViewDidChange(_ textView: UITextView) {
let size = CGSize(width: view.frame.width, height: .infinity)
let estimatedSize = textView.sizeThatFits(size)
textView.constraints.forEach { (constraint) in
if constraint.firstAttribute == .height {
constraint.constant = estimatedSize.height
}
}
}
在此先感谢您的帮助!
textViewDidChange(...)
实际上应该对输入的每个字符做出反应(通过键盘,而不是以编程方式)。 textView.sizeThatFits(...)
可能 return 不是您想要的。快速查看文档并没有发现对 UIView 实现的覆盖,它只是 return 与视图的大小相同。
NSAttributedString 的 boundingRect(with:options:context:) 可能值得研究以恢复所需的文本大小(以及视图的大小)。
另请注意我对您的问题的评论。将 scrollEnabled
设置为 false 应该已经将 textView 的固有大小设置为您需要的大小,您甚至不必设置高度限制。如果您的 textView 在具有同等优先级约束的视图之间被挤压,您可以沿垂直轴提高 compressionResistancePriority
。
说明该示例的快速片段(不是对您问题的回答,但可能是您尝试做的事情的不同方法):
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController, UITextViewDelegate {
private lazy var textView = UITextView()
override func loadView() {
let view = UIView()
view.backgroundColor = .orange
textView.frame = view.bounds
textView.backgroundColor = .white
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(textView)
NSLayoutConstraint.activate(
[textView.topAnchor.constraint(equalTo: view.topAnchor),
textView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
textView.leadingAnchor.constraint(equalTo: view.leadingAnchor)]
)
textView.delegate = self
self.view = view
}
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
我已经在故事板中使用约束实现了这个。
故事板如下:
我在控制器中添加的代码是:
class ViewController: UIViewController {
@IBOutlet weak var messageTextView: UITextView!
@IBOutlet weak var messageTextViewHeightConstraint: NSLayoutConstraint!
}
extension ViewController: UITextViewDelegate {
public func textViewDidChange(_ textView: UITextView) {
resizeTextView(textView: textView)
}
func resizeTextView(textView: UITextView) {
let sizeThatFitsTextView = messageTextView.sizeThatFits(CGSize(width: messageTextView.frame.width, height: CGFloat(MAXFLOAT)))
messageTextViewHeightConstraint.constant = sizeThatFitsTextView.height
}
}
我正在使用此处的约束动态更改 UITextView
的高度,如果您将文本添加到其框架之外,它会增加。
希望这有助于实现你想要的。
您需要使用 UITextView
框架而不是 UIView
。
func textViewDidChange(_ textView: UITextView) {
let size = CGSize(width: textView.frame.width, height: .infinity)
let estimatedSize = textView.sizeThatFits(size)
textView.constraints.forEach { (constraint) in
if constraint.firstAttribute == .height {
constraint.constant = estimatedSize.height
}
}
}
我有一个 UITextView,当输入超出其框架边界的文本时,它会动态改变高度。但是,只有在键入完整字符串并按下 space 后,高度才会改变。这留下了一个尴尬的时刻,用户看不到他们正在输入的单词。
如何让我的 textViewDidChange
对输入的每个字符做出反应,而不是在输入完整字符串时做出反应?
这是初始化变量:
lazy var descriptionTextView: UITextView = {
let tv = UITextView()
tv.backgroundColor = .white
tv.font = UIFont.systemFont(ofSize: 18)
tv.frame = CGRect(x: 0, y: 0, width: 200, height: 40)
tv.translatesAutoresizingMaskIntoConstraints = false
tv.delegate = self
tv.isScrollEnabled = false
return tv
}()
然后我将它添加到子视图并将其锚定在我的 viewDidLoad
:
view.addSubview(descriptionTextView)
descriptionTextView.anchor(top: privacyLabel.bottomAnchor, left:
view.leftAnchor, bottom: descriptionTextViewUnderLine.topAnchor, right: view.rightAnchor, paddingTop: 16, paddingLeft: 24, paddingBottom: 0, paddingRight: 24, width: 0, height: 40)
在扩展中,我输入了textViewDidChange
func textViewDidChange(_ textView: UITextView) {
let size = CGSize(width: view.frame.width, height: .infinity)
let estimatedSize = textView.sizeThatFits(size)
textView.constraints.forEach { (constraint) in
if constraint.firstAttribute == .height {
constraint.constant = estimatedSize.height
}
}
}
在此先感谢您的帮助!
textViewDidChange(...)
实际上应该对输入的每个字符做出反应(通过键盘,而不是以编程方式)。 textView.sizeThatFits(...)
可能 return 不是您想要的。快速查看文档并没有发现对 UIView 实现的覆盖,它只是 return 与视图的大小相同。
NSAttributedString 的 boundingRect(with:options:context:) 可能值得研究以恢复所需的文本大小(以及视图的大小)。
另请注意我对您的问题的评论。将 scrollEnabled
设置为 false 应该已经将 textView 的固有大小设置为您需要的大小,您甚至不必设置高度限制。如果您的 textView 在具有同等优先级约束的视图之间被挤压,您可以沿垂直轴提高 compressionResistancePriority
。
说明该示例的快速片段(不是对您问题的回答,但可能是您尝试做的事情的不同方法):
//: A UIKit based Playground for presenting user interface
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController, UITextViewDelegate {
private lazy var textView = UITextView()
override func loadView() {
let view = UIView()
view.backgroundColor = .orange
textView.frame = view.bounds
textView.backgroundColor = .white
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(textView)
NSLayoutConstraint.activate(
[textView.topAnchor.constraint(equalTo: view.topAnchor),
textView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
textView.leadingAnchor.constraint(equalTo: view.leadingAnchor)]
)
textView.delegate = self
self.view = view
}
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
我已经在故事板中使用约束实现了这个。
故事板如下:
我在控制器中添加的代码是:
class ViewController: UIViewController {
@IBOutlet weak var messageTextView: UITextView!
@IBOutlet weak var messageTextViewHeightConstraint: NSLayoutConstraint!
}
extension ViewController: UITextViewDelegate {
public func textViewDidChange(_ textView: UITextView) {
resizeTextView(textView: textView)
}
func resizeTextView(textView: UITextView) {
let sizeThatFitsTextView = messageTextView.sizeThatFits(CGSize(width: messageTextView.frame.width, height: CGFloat(MAXFLOAT)))
messageTextViewHeightConstraint.constant = sizeThatFitsTextView.height
}
}
我正在使用此处的约束动态更改 UITextView
的高度,如果您将文本添加到其框架之外,它会增加。
希望这有助于实现你想要的。
您需要使用 UITextView
框架而不是 UIView
。
func textViewDidChange(_ textView: UITextView) {
let size = CGSize(width: textView.frame.width, height: .infinity)
let estimatedSize = textView.sizeThatFits(size)
textView.constraints.forEach { (constraint) in
if constraint.firstAttribute == .height {
constraint.constant = estimatedSize.height
}
}
}