Swift UITextViewの高さを入力内容に合わせて変える方法

StoryBoard

f:id:happy_teeth_ago:20210630234017j:plain

f:id:happy_teeth_ago:20210630234216j:plain

Delegate メソッド

extension DiaryCreateController: UITextViewDelegate{

   //frexble textView
    func textViewDidChange(_ textView: UITextView) {
        let size = CGSize(width: textView.frame.width, height: .infinity)

//指定された適切なサイズを返却する
        let estimatedSize = textView.sizeThatFits(size)

//高さの入れ物を用意しておく
        let expectedHeigth: CGFloat
        
        switch estimatedSize.height {

//40-140の間は、フレキシブル
            case 44...140: expectedHeigth = estimatedSize.height

//それ以外は、44以下なら44を そうでないなら140を返却
            default: expectedHeigth = estimatedSize.height < 44 ? 44 : 140
        }



        textView.constraints.first(where: { $0.firstAttribute == .height })?.constant = expectedHeigth

  //140以上の高さのときはスクロール止める      
        textView.isScrollEnabled = expectedHeigth < 140

    }

.sizeThatFits

指定されたサイズに最適なサイズを計算して返すようにビューに要求します。

.isScrollEnabled

tureならスクロールする
falseならスクロール止める

.firstAttribute where で条件の絞り込み

制約に参加している最初のオブジェクトの属性

textView.constraints は [NSLayoutConstraint]型

StoryBoardはあまり好きになれない。次回からコードで書くか、SwiftUIに変更しようと思う