iOS Swift - 移动UIView

时间:2017-05-13 05:48:08

标签: ios swift uiview uitextfield

首先我将描述布局: 我有一个带有两个UITextfields的UIView。当我选择任一文本字段时,我希望UIView向上移动,使得键盘不覆盖文本字段。正常的解决方案很明显且已经实施:keyboardWillHidekeyboardWillShow。当我选择一个文本字段时,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
    }
}

编辑答案如接受的答案中所述,我们选择更新指示UIViews位置的布局约束,而不是调整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
    }
}

1 个答案:

答案 0 :(得分:2)

由于您在视图上使用带有约束的自动布局,因此它会自动重置回原始位置。因此,如果您更改约束的值,则不应更改视图位置,这应该有效。