【问题标题】:Subviews does not follow constraints and dismissing keyboard leaves a black space at the bottom of the view子视图不遵循约束并且关闭键盘会在视图底部留下一个黑色空间
【发布时间】:2020-02-05 02:01:46
【问题描述】:

每当我的根视图控制器(导航控制器)推送到我的第二个 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

}

之前:

之后:

【问题讨论】:

  • (UI 以编程方式构建)
  • 可以加截图吗?
  • @ParthTamane 它不会让我
  • Imgur 链接怎么样?
  • 如果您添加了约束,请尝试此代码 -> self.view.layoutIfNeeded() 如果您设置了框架并觉得这是问题所在。尝试将框架代码放入此 -> DispatchQueue.main.asyncAfter(deadline: .now()+0.2) { }

标签: swift xcode uikit


【解决方案1】:

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

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

This is my answer in different issue

【讨论】:

    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 2015-09-30
    • 2023-03-23
    相关资源
    最近更新 更多