首页 > 解决方案 > 子视图不遵循约束并且关闭键盘会在视图底部留下一个黑色空间

问题描述

每当我的根视图控制器(导航控制器)推送到我的第二个 VC(我们称之为 VC2)时,所有 VC2 的子视图:按钮、标签和文本字段都会向下移动,即使我已经对其设置了约束。此外,每当我在编辑文本字段后关闭键盘时,视图都会返回到约束设置它的预期位置,并在视图底部留下一个黑色空间。这是我的 VC2 代码:

override func viewDidLoad() {
    super.viewDidLoad()
    view.layer.backgroundColor = UIColor(named: const.white)?.cgColor

    nameField.delegate = self
    emailField.delegate = self
    passField.delegate = self

    setUpTitles()
    setUpTextFields()
    setUpButton()

    addPaddingAndBorder(to: nameField)
    addPaddingAndBorder(to: emailField)
    addPaddingAndBorder(to: passField)


    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeView(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardIsDone(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeView(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

    let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard(_:)))
    self.view.addGestureRecognizer(tap)

}

deinit {
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

}

@objc func keyboardWillChangeView(notification: Notification){
    view.frame.origin.y = -150 //This is temporary

}

@objc func keyboardIsDone(notification: Notification){
    view.frame.origin.y = 0

}

@objc func dismissKeyboard(_: UITapGestureRecognizer){ //Tapping outside the keyboard 
    nameField.resignFirstResponder()
    emailField.resignFirstResponder()
    passField.resignFirstResponder()

}

//Executed when hitting return key
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    nameField.resignFirstResponder()
    emailField.resignFirstResponder()
    passField.resignFirstResponder()

    view.frame.origin.y = 0

    return true

}

前:

前

后:

后

标签: swiftxcodeuikit

解决方案


当您使用响应者时,您应该将您的第一个文本字段设置为第一响应者,如下所示:

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        firstTextField.becomeFirstResponder()
    }

这是我在不同问题上的回答


推荐阅读