swift - 子视图不遵循约束并且关闭键盘会在视图底部留下一个黑色空间
问题描述
每当我的根视图控制器(导航控制器)推送到我的第二个 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
}
前:
后:
解决方案
当您使用响应者时,您应该将您的第一个文本字段设置为第一响应者,如下所示:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(true)
firstTextField.becomeFirstResponder()
}
推荐阅读
- r - R滚动减法矢量化替代for循环
- javascript - MongoDB中的TTL索引是否有替代方案,不会永久删除文档?
- python - python re match ip address
- database - 如何在 Laravel 中设计一个具有两个以上属性的实体的数据库模式?
- azure - 在 Azure Python SDK 返回值中“取消引用”子资源
- python - Windows 设备文件不使用 python win32API 返回有效句柄
- python - 为什么我的 y_test 和 y_train 存储为字符串?如何将它们转换为图像的数组表示?
- python - 单击找到的第二个元素 - Selenium Python
- pandas - 如何在 PySpark 中复制 Pandas 的 between_time 函数
- java - 如何解决类案例异常?使用数组列表