[Swift] UITextView에 여러 줄로 대응하는placeholder 추가

6970 단어 SwiftiOS

UITextView에 placeholder가 없습니다!?


스위프트 근처에서는 상식?그럴지도 모르지만, 스위프트를 해본 제겐 충격적이었어요.
징징거리면 옛날부터 다들 곤란한 것 같고 번잡한 샘플 코드도 많고...
plaaceholder의 복수 줄이 그곳에 대응하는 것은 필요하지 않지만, 이번에 우연히 만들려고 하기 때문이다.

UITextView에 여러 줄에 해당하는 placeholder 추가


단순히 TextView에 placeeholder를 넣고 TextView로 RX로 입력 검사를 해서 placeeholder와 같은 행동을 하도록 한다.

코드

import UIKit
import RxSwift
import SnapKit

/// 複数行対応Placeholder付きUITextView
final class UITextViewWithPlaceholder: UITextView {
    private let placeholderTextView = UITextView()
    private let disposeBag = DisposeBag()

    init(placeholder: String = "", font: UIFont = UIFont.systemFont(ofSize: UIFont.systemFontSize)) {
        super.init(frame: CGRect.zero, textContainer: nil)

        // Placeholder
        self.placeholderTextView.font = font
        self.placeholderTextView.backgroundColor = UIColor.clear
        self.placeholderTextView.isUserInteractionEnabled = false
        self.placeholderTextView.textColor = UIColor(hex: ColorConstant.TEXT_PLACEHOLDER)
        self.addSubview(self.placeholderTextView)

        // AutoLayout
        self.placeholderTextView.snp.makeConstraints{ make in
            make.center.equalToSuperview()
            make.width.equalToSuperview()
            make.height.equalToSuperview()
        }

        // RX
        self.rx.text.orEmpty
            .subscribe(onNext: {[weak self] value in
                self?.placeholderTextView.text = value.isEmpty ? placeholder : nil
            }).disposed(by: disposeBag)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

이용 방법


일반적인 TextView와 마찬가지로 사용할 수 있습니다.
let textView = UITextViewWithPlaceholder(placeholder: "どうして\nplaceholderないの…")

결실



감상


extension에서 UITExtView를 확장하고 UITExtViewDelegate를 합치는 방식도 괜찮다고 생각합니다. 어쨌든 이런 표준으로 제공되기를 바랍니다.
같은 느낌을 받은 사람도 있겠지.

좋은 웹페이지 즐겨찾기