텍스트의 길이에 따라 배경을 동적으로 가변 (표시)하는 UITextView

소개



안녕하세요.
채팅 앱, 메모 앱 등에서 사용하는 것과 같은
배경의 길이가 가변의 UITextView의 구현에 조금 고민했기 때문에 써 보았습니다.
이르지 못하는 점 등 많이 있다고 생각합니다만, 코멘트등 받을 수 있으면 다행입니다.

샘플





Storyboard 준비



사실 UITextView의 높이가 늘어나는 것은 아닙니다.
뒤에 배치한 배경색이 있는 UIView가 동적으로 가변되도록 하고 있습니다.

UIView(배경) 제약



UITextView 제약



또한 배경 UIView Height Constraint 및 UITextView bottom Constraint
다음과 같이 IBOutlet 연결합니다.
(이미지에서는 UITextView의 bottomConstraint를 연결하고 있습니다. 마찬가지로 UIView의 HeightConstraint도 연결하십시오.)



내용에 맞게 배경 UIView가 너무 늘지 않도록 조절



UITextView의 Height는 다음과 같습니다.



그래서 너무 늘었을 때는 Window의 크기 (외형의 크기)에 맞게 조정합니다.
if textView.frame.height <= textViewBackgroundView.frame.height {
    textViewBackgroundHeightConstraint.constant = textView.frame.size.height
}

샘플 코드



MainViewController.swift
import UIKit

class MainViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var textViewBackgroundView: UIView!

    @IBOutlet weak var textViewBottomConstraint: NSLayoutConstraint!
    @IBOutlet weak var textViewBackgroundHeightConstraint: NSLayoutConstraint!

    override func viewDidLoad() {
        super.viewDidLoad()
        textView.delegate = self
        NotificationCenter.default.addObserver(self,
        selector: #selector(MainViewController.showKeyBoard(_:)),
        name: NSNotification.Name.UIKeyboardWillShow,
        object: nil)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        textView.becomeFirstResponder()
        textView.tintColor = UIColor.black
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    //キーボードが表示された時の処理
    func showKeyBoard(_ notification: Notification) {
        if let userInfo = (notification as NSNotification).userInfo {
            if let keyboard = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue{
                textViewBottomConstraint.constant = keyboard.cgRectValue.size.height
            }
        }
    }
}

extension MainViewController: UITextViewDelegate {
    //textに変更があった際に呼び出される
    func textViewDidChange(_ textView:UITextView) {
        if textView.frame.height <= textViewBackgroundView.frame.height {
            textViewBackgroundHeightConstraint.constant = textView.frame.size.height
        }else {
            textViewBackgroundHeightConstraint.constant = textView.sizeThatFits(textView.frame.size).height
        }
    }
}

참고로 한 기사


  • Apple 참조 UITextView
  • UIScrollView가 가지는 2개의 사이즈에 대해서 u16suzu씨의 블로그보다

  • 봐 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기