0

I have a UITextView that has a placeholder similar to Twitter's create post screen.

I have implemented the below code however, I am experiencing the below, unexpected behavior:

  1. UITextView capitalizes the second letter in the text after typing
  2. Placeholder not visible on viewDidLoad

NOTE: This is all in a CollectionReusableView

CODE

lazy var textView: UITextView = {
        let view = UITextView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.delegate = self
        view.text = "What's happening?"
        view.textColor = .lightGray
        view.textContainerInset = .zero
        view.textContainer.lineFragmentPadding = 0.0
        view.font = UIFont.systemFont(ofSize: 20)
        return view
    }()

func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.textColor == UIColor.lightGray {
            textView.text = nil
            textView.textColor = .label
        }
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.text = "What's happening?"
            textView.textColor = UIColor.lightGray
        }
    }
    
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
            let currentText: String = textView.text
            let updatedText = (currentText as NSString).replacingCharacters(in: range, with: text)
            if updatedText.isEmpty {
                textView.text = "What's happening?"
                textView.textColor = .lightGray
                textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
            } else if textView.textColor == UIColor.lightGray && !text.isEmpty {
                textView.textColor = .label
                textView.text = text
            }
            else {
                return true
            }
            return false
    }
    
    func textViewDidChangeSelection(_ textView: UITextView) {
        if textView.textColor == UIColor.lightGray {
            textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)
        }
    }
David Henry
  • 1,972
  • 20
  • 43

0 Answers0