Автоматическое изменение размера настраиваемого текстового поля для метки из нескольких строк - PullRequest
0 голосов
/ 16 июня 2020

У меня есть настраиваемое текстовое поле, в которое я добавляю метку ошибки под текстовым полем. Я хочу изменить размер этого настраиваемого текстового поля так, чтобы оно расширялось меткой ошибки из нескольких строк и не перекрывалось с другими полями под ним. В IB я правильно закрепил представление, поэтому это не проблема.

Как это исправить?

Screenshot

class LoginViewController: UIViewController {
    @IBOutlet weak var emailTextField: CustomTextField!
    @IBOutlet weak var passwordTextField: CustomTextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        emailTextField.setError("Multiple line error. Multiple line error. Multiple line error. Multiple line error.")
    }
}

class CustomTextField: UITextField {

    var bottomBorder = UIView()
    var errorLabel = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        self.initialize()

        // Setup Bottom-Border
        // ....

        errorLabel.translatesAutoresizingMaskIntoConstraints = false
        self.addSubview(errorLabel)
        errorLabel.topAnchor.constraint(equalTo: self.bottomBorder.bottomAnchor, constant: 4).isActive = true
        errorLabel.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
        errorLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
        errorLabel.numberOfLines = 0
        errorLabel.lineBreakMode = .byWordWrapping
        errorLabel.sizeToFit()
    }

    func initialize() {
        self.text = ""
        self.clearError()

        // ...
    }
    func setError(error: String) {
        self.errorLabel.text = error
        self.errorLabel.isHidden = false
        self.setNeedsLayout()
        self.layoutIfNeeded()
    }

    func clearError() {
        self.errorLabel.text = ""
        self.errorLabel.isHidden = true
    }
}

1 Ответ

2 голосов
/ 16 июня 2020

UITextField - это всего одна строка, которую вам нужно использовать UITextView или лучше

class CustomView: UIView {
   let textfield = UITextField() 
   let bottomBorder = UIView()
   let errorLabel = UILabel()
   .....
}

Таким образом, вид будет расширяться в соответствии с суммой высоты текстового поля, высоты границы и высоты текста метки

...