⚠️ How to check line and limit

텍스트 입력창에 줄 수 제한을 주고 싶었는데, 기존 로직은 전체 텍스트의 '\n'을 체크해서 제한을 주는 방식

이렇게 할 경우 한 줄에 텍스트뷰의 width를 초과해서 입력될 경우를 체크하지 못해서 에러 발생

또한, shouldChanged에서 새로들어온 텍스트와 기존 텍스트를 비교했었기 때문에, numberOfLine함수를 제대로 적용시키기 어려웠음

textViewChange가 완료된 후, 글자 수, 개행체크를 통해서 지정된 조건을 넘어섰을 경우 deleteBackword키워드로 새로 들어온 단어를 삭제하는 방식으로 변경

extension CreateRecordView: UITextViewDelegate {
    
    func textViewDidChange(_ textView: UITextView) {
        if textView.text.count > 180 {
            textView.deleteBackward()
        }
        if textView.numberOfLine() >= textView.textContainer.maximumNumberOfLines {
            textView.deleteBackward()
        }
        byteView.text = "\\(textView.text.count)/180"
    }
}
extension UITextView {
    func numberOfLine() -> Int {
        if let font = self.font {
            let rows = round((self.contentSize.height - self.textContainerInset.top - self.textContainerInset.bottom) / font.lineHeight)
            return Int(rows)
        } else {
            print("Cannot get font size")
            return 0
        }
    }
}

&ref

글자 수 제한

[iOS] TextView - 플레이스홀더, 패딩, 글자 수 제한, 커서, 키보드 dismiss

Delete word | https://stackoverflow.com/questions/5225763/limit-the-number-of-lines-for-uitextview

Number of Line | https://stackoverflow.com/questions/5837348/counting-the-number-of-lines-in-a-uitextview-lines-wrapped-by-frame-size

// 폰트 사이즈와 전체 텍스트 뷰 사이즈의 비율로 줄 수 계산
let rows = round((self.contentSize.height - self.textContainerInset.top - self.textContainerInset.bottom) / font.lineHeight)