自定义 TextField 不符合约束条件

Custom TextField does not comply to constraints

我在 HoshiTextField 上遇到这个问题已经有一段时间了,我也在 git 上打开了一个问题,但没有得到答案...

这是它应该的样子,如果用户选择 textField:

viewDidLoad里面的textField设置为becomeFirstResponder或者当popping设置ViewControllertextField里面第一个 VC 被选中。显然这弄乱了 textFieldframesconstraints 但我完全不知道如何解决这个问题。

如您所见,"Email-Adesse"-文本移动到左上角,当 pushingpoping 回到 ViewController 时,它移动到更远的地方constraints。当使用调试器检查 View Hirarchy 时,"Email-Adresse"-Text 看起来很完美,即使它不是。在 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 repo to my project

抱歉,一开始我误解了你的问题。

我觉得问题在于,在某些时候,当 HoshiTextField 被选中并离开屏幕时,它会被取消选中,但不会更新其布局。所以当你回来时,动画仍然保持相对相同,但从不同的角度来看。

我不确定如何准确解决该问题,但在将以下内容添加到您的 EmailVC

后,我能够使屏幕看起来正常
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    view.endEditing(true)
}

希望一切顺利。它并没有真正解决问题,但它确实让您的应用程序 UI 在这种情况下看起来很合适。

这里是完整的测试控制器,有 2 种可能的解决方案

演示:备用 1 - 经常出现已经展开

演示:Alternate 2 - 总是有延迟,展开是可见的

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
    }
}