UIKeyboardWillShowNotification调用不会为UIToolbar设置动画

时间:2015-03-02 14:15:00

标签: ios uitoolbar uikeyboard uianimation

我有一个带有文本字段的UIToolbar,当键盘显示时,它应该向上移动。

在我的viewWillAppear中,我注册了我的观察者:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)

(viewWillDisappear删除我的观察者)

功能:

func keyboardWillShow(notification: NSNotification) {
    println("will show")

    let userInfo = notification.userInfo!

    let keyboardFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
    let animationDuration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as NSNumber).doubleValue

    let animations: () -> () = {
        self.toolBar.frame.origin.y = self.view.frame.size.height - keyboardFrame.height - self.toolBar.frame.height
    }

    if animationDuration > 0 {
        let options = UIViewAnimationOptions(UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSNumber).integerValue << 16)) // http://stackoverflow.com/a/18873820/242933
        UIView.animateWithDuration(animationDuration, delay: 0, options: options, animations: animations, completion: nil)
    } else {
        animations()
    }
}

现在,当我点按UITextField时,键盘出现并调用keyboardWillShow。但是动画不会发生,直到第二次调用keyboardWillShow(除非高度改变,否则多个键盘不起作用;例如当自动完成条改变状态时)。

我做错了什么?无论我到哪里,都是以这种方式实现的。

编辑:更多详情:

使用工具栏的正确高度调用

动画(),但UI不会将工具栏放在正确的位置。也许它还没有被初始化?

更多细节:当UIToolbar用作inputAccessoryView时,当我点按UITextField时,它不会出现在键盘上方,但是当我开始输入时它确实如此。我在这里没有选择......

更多尝试找到问题:似乎运行任何其他动画都有效,例如更改工具栏的高度。

1 个答案:

答案 0 :(得分:0)

我在this GitHub repository找到了适合我的答案

    let animations: () -> () = {
        if !(self.tableView.tracking || self.tableView.decelerating) {
            // Move content with keyboard
            if overflow > 0 {                   // scrollable before
                self.tableView.contentOffset.y += insetChange
                if self.tableView.contentOffset.y < -insetOld.top {
                    self.tableView.contentOffset.y = -insetOld.top
                }
            } else if insetChange > -overflow { // scrollable after
                self.tableView.contentOffset.y += insetChange + overflow
            }
        }
    }