首先我将描述布局:
我有一个带有两个 UITextfields 的 UIView。当我选择任一文本字段时,我希望 UIView 向上移动,以便文本字段不会被键盘覆盖。正常的解决方案是显而易见的并且已经实现:keyboardWillHide
和 keyboardWillShow
。当我选择一个文本字段时,UIView 的行为符合预期,但是,当我选择一个文本字段,然后选择下一个文本字段时,UIVIEW 会弹回到原始约束,并且不会重新调整,即使 keyboardWillShow
是又打电话了。
我怎样才能达到预期的效果:当选择一个文本字段时,UIView 向上移动,然后当选择下一个文本字段时,UIView 保持在完全相同的凸起位置。
为什么 UIView 在当前选择的第二个文本字段上重置?
下面是相关代码,这些函数都是在VDL中设置的。没有其他代码触及文本字段。值得一提的是,这些文本字段出现在当前上下文的模态视图中。另外值得一提的是,键盘的类型为 decimalPad
// MARK: - keyboard Controls
func keyboardWillShow(notification:NSNotification) {
print("Keyboard show")
if isKeyboardOffset == false {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("Keyboard show... \(keyboardSize)")
self.viewToMove.frame.origin.y -= keyboardSize.height / 2
}
isKeyboardOffset = true
}
}
func keyboardWillHide(notification:NSNotification) {
print("Keyboard hide")
if isKeyboardOffset == true {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("keyboard hide...")
self.viewToMove.frame.origin.y += keyboardSize.height / 2
}
isKeyboardOffset = false
}
}
编辑答案: 正如已接受的答案中所述,我们选择更新指示 UIView 位置的布局约束,而不是调整 UIView 的位置。以下是 keyboardWillShow
func keyboardWillShow(notification:NSNotification) {
if isKeyboardOffset == false {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
print("Keyboard show... \(keyboardSize)")
self.topConstraint.constant -= 100
}
isKeyboardOffset = true
}
}
最佳答案
由于您使用的自动布局对 View 有限制,因此它会自动重置回原始位置。因此,如果您更改约束的值,这应该可以工作,而不是更改 View 位置。
关于iOS Swift - 多个 UITextField 移动 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43949682/