Swift键盘动画上下移动

时间:2015-11-17 17:54:58

标签: swift animation keyboard

单击文本字段后,我的应用程序向下移动到空白区域,然后使用键盘进行备份。我如何让它停止这样做?我只是想在键盘激活时让屏幕向上移动一点。 这个问题与其他Swift键盘问题不同,因为它使用来自Deitel的书籍 I0S8 for programmers 的代码。解决这个问题可能有助于拥有这本书的其他人。 谢谢,

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "keyboardWillShow:",
        name: UIKeyboardWillShowNotification,
        object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "keyboardWillHide:",
        name: UIKeyboardWillHideNotification,
        object: nil)        // listen for keyboard show/hide notifications
}
override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().removeObserver(self,
        name: UIKeyboardWillHideNotification, object: nil)        // unregister for keyboard show/hide notifications
}
     // called when app receives UIKeyboardWillShowNotification
func keyboardWillShow(notification: NSNotification) {
    let userInfo = notification.userInfo!
    let frame = userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue!
    let size = frame.CGRectValue().size // keyboard's size

    // get duration of keyboard's slide-in animation
    let animationTime = userInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue

    // scroll self.tableView so selected UITextField above keyboard
    UIView.animateWithDuration(animationTime) {
        var insets = self.tableView.contentInset
        insets.bottom = size.height
        self.tableView.contentInset = insets
        self.tableView.scrollIndicatorInsets = insets
    }
}    // called when app receives UIKeyboardWillHideNotification
func keyboardWillHide(notification: NSNotification) {
    var insets = self.tableView.contentInset
    insets.bottom = 2
    self.tableView.contentInset = insets
    self.tableView.scrollIndicatorInsets = insets
}
// hide keyboard if user touches Return key
func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}

1 个答案:

答案 0 :(得分:0)

如果您调整contentInset属性,则还应该使用contentOffset属性并调整该属性以实现所需的行为。但是我建议不要使用插图,而是鼓励你选择两条道路之一:

1)如果使用Autolayout:

如果您正在使用Autolayout并将约束作为IBOutlet连接,则在willShow上将约束常量调整为您需要的任何值。

self.constraint.constant = 2
self.view.layoutIfNeeded()

将在没有动画的情况下进行调整并设置动画:

self.constraint.constant = 2
UIView.animateWithDuration(duration, animations: {
    self.view.layoutIfNeeded()
})

然后当调用willHide时,只需将约束常量设置回0(或者它的默认值/原始值是什么,并设置为动画)。

2)如果不使用Autolayout:

不是调整约束,而是根据需要调整要移动的视图的帧位置和动画。