2017-03-28 3 views
1

whatsappのように、長い文字列を入力するときにtextviewの高さのサイズを変更するようにしたいとします。しかし、一度それが最大の高さに達すると、テキストビューは最大の高さにとどまり、テキストビューはスクロール可能になります。メッセージに返信するときは、whatsappのテキストビューとまったく同じです。UITextViewは、最大高さを制限して高さを動的に変更します

動的にサイズを変更する方法が見つかりましたが、textView.isScrollEnabled = trueが最大高さに達すると設定すると、テキストビューは縮小されますがスクロール可能になります。

テキストビューをwhatsappのtextviewとまったく同じようにするにはどうすればよいですか?

override func viewDidLoad() { 
    super.viewDidLoad() 
    NotificationCenter.default.addObserver(self, selector: #selector(updateHeight), name: NSNotification.Name.UITextViewTextDidChange, object: nil) 
    textView.isScrollEnabled = false 
    // ... 
} 

func updateHeight() { 
    var contentSize = textView.sizeThatFits(textView.bounds.size) 
    contentSize.width = UIScreen.main.bounds.width 
    if contentSize.height > UIScreen.main.bounds.height/5{ 
     textView.isScrollEnabled = true 
     contentSize.height = UIScreen.main.bounds.height/5 
    } else { 
     textView.isScrollEnabled = false 
    } 
    textView.frame.size = contentSize 
} 

enter image description here

+0

自動レイアウトを使用していますか?はいの場合、あなたはどのような制約を与えましたか? –

+0

textView.top = tableView.buttom –

+0

高さの制約がある場合は、コンセントを取って毎回フレームを設定するのではなく定数を変更してください。 –

答えて

0
var textViewContentSize = textView.sizeThatFits(textView.bounds.size) 

この意志はあなたにその中のすべてのコンテンツを表示するためにUITextViewに必要な最小サイズを返します。

とコード

if textViewContentSize.height > 200{ 
    textViewContentSize = CGSize(width: textViewContentSize.height, height: 200) 
} 

以下の制限使用はだから今、あなたのtextviewフレームは以下の通りであるため、

textView.frame = CGRect(origin: textView.frame.origin, size: textViewContentSize) 

は、それはあなたのお役に立てば幸いです。

+0

申し訳ありません。助けてくれなかった。とにかく、ありがとう。 –

+0

私は問題がtextView.isScrollEnabled = trueであると考えています。これにより、テキストビュー全体が1行の高さに縮小されます。しかし、私はprint( "Height:\(contentSize.height)")を挿入すると、必要なtextviewの高さを出力します(行数によって異なります)。 –

+0

あなたのコードはswift用です。 –

1
extension ViewController : UITextViewDelegate{ 

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool{ 

    let cursorPosition = self.textView.caretRect(for: self.tvChat.selectedTextRange!.start).origin 
    let currentLine = Int(cursorPosition.y/self.tvChat.font!.lineHeight) 

    UIView.animate(withDuration: 0.3) { 
     if currentLine == 0 { 
      self.constraintHeightTextView.constant = 56 
     }else { 
      self.constraintHeightTextView.constant = self.textView.contentSize.height + 8 // Padding 
     } 
    } 
    self.textView.layoutIfNeeded() 
    self.view.updateConstraints() 
    } 
} 

self.constraintHeightTextViewはTextViewの高さの制約のための出口です。あなたが作業しているテキストの現在の行を計算し、currentLineが他の0がtextView.contentSize.heightにそれを設定している場合は、デフォルト(私の場合は56)にその制約を更新できるのTextViewのテキストが変化すると

希望する

+0

私はあなたのソリューションのtextviewの高さの制約を使用し、私のupdateHeight()にこのコードを入れて、それは動作します。ありがとう。 –

+0

あなたは@CarlHungの答えを受け入れることができますか? –

関連する問題