Пользовательский TextField не соответствует ограничениям - PullRequest
3 голосов
/ 13 марта 2020

У меня уже давно есть эта проблема с HoshiTextField , я также открыл проблему на git, но не получил ответа ...

Это как это должно выглядеть и как это выглядит, если пользователь выбирает textField:

enter image description here

Проблема возникает при установке textField до becomeFirstResponder внутри viewDidLoad или когда popping a ViewController при выборе textField внутри первого VC. Очевидно, это портит frames или constraints textField, но я абсолютно не знаю, как это исправить.

enter image description here

Как Вы можете видеть, что текст «Email-Adesse» перемещается в верхний левый угол, а когда pushing и poping возвращаются к ViewController, он перемещается еще дальше за пределы constraints. При проверке View Hirarchy с помощью отладчика текст «Email-Adresse» выглядит идеально, даже если это не так. Установка ограничений внутри viewDidAppear ничего не изменила.

Я ограничиваю textFields, как и любой другой элемент:

let emailTextField: HoshiTextField = {
    let v = HoshiTextField()
    v.borderActiveColor = .white
    v.borderInactiveColor = .white
    v.textColor = .white
    v.font = UIFont(name: "AvenirNext-Regular", size: 17)
    v.placeholder = "Email-Adresse"
    v.placeholderColor = .white
    v.placeholderFontScale = 0.8
    v.minimumFontSize = 13
    v.borderStyle = .line
    v.autocapitalizationType = .none
    v.translatesAutoresizingMaskIntoConstraints = false
    return v
}()
emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
    emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
    emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
    emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true

Если кто-нибудь может помочь мне здесь, я буду так благодарен! Я надеюсь, что проблема ясна, вы также можете посмотреть на мой проект, чтобы увидеть проблему самостоятельно:

Git репо в мой проект

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Здесь представлен полный тестовый контроллер с 2 альтернативами возможного решения.

Демо: альтернатива 1 - часто кажется уже расширенным

demo

Демо: альтернатива 2 - всегда есть задержка, видно расширение

demo2

class ViewController2: UIViewController {
    @IBOutlet weak var theLabel: UILabel!
    private weak var emailTextField: HoshiTextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        emailTextField = {
            let v = HoshiTextField()
            v.borderActiveColor = .white
            v.borderInactiveColor = .white
            v.textColor = .white
            v.font = UIFont(name: "AvenirNext-Regular", size: 17)
            v.placeholder = "Email-Adresse"
            v.placeholderColor = .white
            v.placeholderFontScale = 0.8
            v.minimumFontSize = 13
            v.borderStyle = .line
            v.autocapitalizationType = .none
            v.translatesAutoresizingMaskIntoConstraints = false
            return v
        }()
        self.view.addSubview(emailTextField)
        emailTextField.topAnchor.constraint(equalTo: theLabel.bottomAnchor, constant: 20).isActive = true
            emailTextField.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30).isActive = true
            emailTextField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -30).isActive = true
            emailTextField.heightAnchor.constraint(equalToConstant: 60).isActive = true

//        DispatchQueue.main.async {
//            self.emailTextField.becomeFirstResponder()    // Alternate 1
//        }
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        emailTextField.becomeFirstResponder()          // Alternate 2
    }
}
0 голосов
/ 13 марта 2020

Извините, я сначала неправильно понял ваш вопрос.

Мне кажется, проблема в том, что в какой-то момент, когда HoshiTextField выбран и покидает экран, он отменяется, но не обновляет свой макет. Итак, когда вы вернетесь, анимации останутся такими же, но с другой стороны.

Я не уверен, как точно решить эту проблему, но я смог заставить экран выглядеть нормально после добавления следующего к вашему EmailVC

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    view.endEditing(true)
}

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

...