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
将UItextView
和UIBUtton
排列在一个UIView
中,并以低优先级为UIView
提供高度限制。
步骤:2
还使用大于或等于为UITextView
提供高度限制。如图所示。
步骤:3
现在你只需要处理contentSize
和isScrollEnabled
如下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 中的内容大小?