UIKeyboardWillShowNotification 调用不会为 UIToolbar 设置动画
UIKeyboardWillShowNotification call does not animate UIToolbar
我有一个带有文本字段的 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)) //
UIView.animateWithDuration(animationDuration, delay: 0, options: options, animations: animations, completion: nil)
} else {
animations()
}
}
现在,当我点击 UITextField
时,键盘出现并调用 keyboardWillShow
。但是直到 keyboardWillShow
第二次被调用时动画才会发生(除非高度发生变化,否则有多个键盘不起作用;例如,当自动完成栏改变状态时)。
我做错了什么?我到处都是这样实现的。
编辑:更多详情:
animations() 以工具栏的正确高度被调用,但是 UI 没有将工具栏放在正确的位置。也许它还没有初始化?
更多细节:将 UIToolbar
用作 inputAccessoryView
时,当我点击 UITextField
时,它不会出现在键盘上方,但当我开始输入时,确实如此。我运行没有选择...
更多尝试发现问题:似乎 运行 任何其他动画都有效,例如更改工具栏的高度。
我在 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
}
}
}
我有一个带有文本字段的 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)) //
UIView.animateWithDuration(animationDuration, delay: 0, options: options, animations: animations, completion: nil)
} else {
animations()
}
}
现在,当我点击 UITextField
时,键盘出现并调用 keyboardWillShow
。但是直到 keyboardWillShow
第二次被调用时动画才会发生(除非高度发生变化,否则有多个键盘不起作用;例如,当自动完成栏改变状态时)。
我做错了什么?我到处都是这样实现的。
编辑:更多详情:
animations() 以工具栏的正确高度被调用,但是 UI 没有将工具栏放在正确的位置。也许它还没有初始化?
更多细节:将 UIToolbar
用作 inputAccessoryView
时,当我点击 UITextField
时,它不会出现在键盘上方,但当我开始输入时,确实如此。我运行没有选择...
更多尝试发现问题:似乎 运行 任何其他动画都有效,例如更改工具栏的高度。
我在 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
}
}
}