UITextView 높이 계산하기

회사 프로젝트에서 기능을 구현하면서 글쓰기 창의 UITextView가 늘어나도록 설정해야 했다.
UITextView는 UIScrollView를 상속하는데, 기본적으로 Intrinsic Size를 가지지 않는다.
그런데 isScrollEnabled 프로퍼티를 꺼주면 안쪽 텍스트 사이즈만큼의 Intrinsic Size를 가지게 된다. 뭔가 당연한듯 하면서도? 당연하지 않은 동작이다.

요구사항에서 일정 높이 이상일때는 글쓰기 창이 다시 스크롤 동작이 되어야 했는데, 이 타이밍을 잡기 위해서 UITextView의 높이를 알아야 한다.
텍스트뷰의 글자가 변하는 시점에 이미 레이아웃은 다 잡혀있는 상태이고, 너비는 이미 고정이기 때문에 sizeThatFits 메소드를 활용하면 원하는 높이를 구할 수 있다.

extension TextContentView: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        let height = self.textViewHeight(textView: textView)
        print(height) // 레이아웃 조정
    }

    private func textViewHeight(textView: UITextView) -> CGFloat {
        let width = textView.frame.width
        let fitSize = textView.sizeThatFits(CGSize(width: width, height: .greatestFiniteMagnitude))
        return fitSize.height
    }
}

높이를 알아냈으므로 isScrollEnabled를 껐다켰다 하면서 텍스트뷰의 높이를 잡아주면 된다.
오토레이아웃을 사용하다 보면 sizeThatFits를 사용할 일이 거의 없는데 레이블 높이 잡을때 이후로 엄청 오랜만에 사용했다.