想要在输入时更改UITextview的高度

时间:2019-01-29 08:03:52

标签: swift

我希望如果用户添加文本并添加新行,则应该增加高度,如果用户删除soometext和某些行,则应降低其高度

为此,我尝试了以下解决方案

func textViewDidChange(_ textView: UITextView) {
        self.updateCharacterCount()
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), 
    execute: {
        let pos = textView.endOfDocument
        self.referenceOfClass?.textOfTextViewForTitle = 
        self.title_Name.text
        let currentRect = textView.caretRect(for: pos ?? 
        UITextPosition.init())

        if (currentRect.origin.y == -1 || currentRect.origin.y == 
        CGFloat.infinity){
         if let val = self.indexPath{
             self.referenceOfClass?.previousRectforTitle = currentRect
             self.referenceOfClass?.inq_Tableview.reloadRows(at: 
              [val], with: .automatic)
         }
     }
     else if currentRect.origin.y < 
         self.referenceOfClass?.previousRectforTitle.origin.y ?? 0.0 {
         if let val = self.indexPath{
             self.referenceOfClass?.previousRectforTitle = currentRect
             self.referenceOfClass?.inq_Tableview.reloadRows(at: 
              [val], with: .automatic)
        }
    }
    })
}

,但在此textView.caretRect(for:pos ??中不起作用)             UITextPosition.init())始终返回相同的值(0,-1)

那我该如何解决呢?

我正在使用xcode10.1,并且此textview在tableviewcell中

2 个答案:

答案 0 :(得分:0)

您可以尝试一下, 在下面获取高约束的出口和代码

@IBOutlet weak var txtMessageHeightConstraint: NSLayoutConstraint!

extension GigMessageSocketViewController:UITextViewDelegate
{

    func textViewDidChange(_ textView: UITextView)
    {
        isClickOnSendMessage = true
        let contentSize = txtMessage.sizeThatFits(CGSize(width: txtMessage.bounds.size.width, height: CGFloat(Float.greatestFiniteMagnitude)))

        if textView.contentSize.height < 100.0
        {
            txtMessageHeightConstraint.constant = CGFloat(ceilf(Float(contentSize.height)))
            textView.layoutIfNeeded()
            textView.updateConstraints()
            textView.scrollRangeToVisible(textView.selectedRange)
        }
    }
}    

答案 1 :(得分:0)

关于如何解决此问题的我的第一个想法是创建一个自定义UITextfield,它将是一个UIView内含内容模式scaleToFill的UIView,您将使UITextfield的每个组件都变得清晰

self.textColor = UIColor.clear
self.tintColor = UIColor.clear
self.borderStyle = UITextBorderStyle.none
self.placeholder=""

和功能

func textField(_ textField:UITextField,shouldChangeCharacters在范围内:NSRange,replacementString字符串:String)-> Bool {}

您将更新UILabel文本,以便由于矛盾而自动进行缩放。