我有一个位于屏幕底部的UIToolbar
。当用户点击工具栏中的UITextField
时,会出现键盘,我会检测键盘大小并通过更改其自动布局约束常量来移动工具栏。 (它对其超级视图有一个底部间距约束。)这很好用,直到用户在iPad上取消键入(或拆分)键盘。此时工具栏定位不正确。我注意到在消息应用程序中,即使用户取消键盘键盘,工具栏也始终位于键盘上方,当用户重新定位键盘时,它总是完美地位于键盘上方。在做了一些研究之后,it was suggested通过倾听UIKeyboardWillChangeFrameNotification
并检查UIKeyboardFrameEndUserInfoKey
来处理这个问题。但是,该值可能不存在,因此我不确定在这种情况下该怎么做。
我的问题是,是正确的方法来收听键盘框架更改通知并更新自动布局约束,还是有其他方法可以采取(inputAccessoryView
文本字段弹出) ?如果是这样,如何检测和处理各种情况(隐藏,出现,更新框架,解除对接,重新定位)以确保它始终位于键盘上方或底部如果没有键盘(或者没有键盘)正在使用的硬件键盘??
请参阅下文,了解我目前如何处理UIKeyboardWillChangeFrameNotification
处理程序中的键盘外观/消失/帧更改(Obj-C +伪代码的混合)。
这个问题是它在取消停靠/拆分时错误地定位工具栏,在取消停靠时重新定位,以及使用硬件键盘。此外,我发现当键盘未对接时,展开/折叠QuickType不会触发UIKeyboardWillChangeFrameNotification
(停靠时)。
keyboardFrameWillChange {
CGSize keyboardBeginSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGSize keyboardEndSize = [info[UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
CGFloat newOffset = 0;
CGFloat toolbarPositionOffset = self.toolbarBottomConstraint.constant;
//get collection view's contentInset and contentOffset
//keyboard is appearing or disappearing or device is rotating with keyboard up
if keyboardEndSize.height == keyboardBeginSize.height {
if toolbarPositionOffset > 0 { //if dismissing
newOffset = keyboardEndSize.height;
toolbarPositionOffset -= newOffset;
//update content inset and offset
} else { //else appearing
newOffset = keyboardEndSize += newOffset;
toolbarPositionOffset += newOffset;
//update content inset and offset
}
}
//keyboard height increasing (expanding QuickType)
else if keyboardEndSize.height > keyboardBeginSize.height {
newOffset = keyboardEndSize.height - keyboardBeginSize.height;
toolbarPositionOffset += newOffset;
//update content inset and offset
}
//else keyboard height decreasing (collapsing QuickType)
else {
newOffset = keyboardBeginSize.height - keyboardEndSize.height;
toolbarPositionOffset -= newOffset;
//update content inset and offset
}
self.toolbarBottomConstraint.constant = toolbarPositionOffset;
//set new contentInset and offset
[self.toolbar layoutIfNeeded];
}
答案 0 :(得分:0)
我找到了解决我遇到的问题的解决方案,虽然它没有提供我的目标确切的最终结果。具体来说,不是在取消停靠/拆分时尝试在键盘上方移动工具栏,而是在这种情况下将其固定在底部,并且只有在停靠时才将其放在键盘上方。这解决了我在硬件键盘上遇到的问题。
收听UIKeyboardWillShowNotification
并将工具栏的约束常量设置为等于UIKeyboardFrameEndUserInfoKey
值。
聆听UIKeyboardWillHideNotification
并将工具栏的约束常量设置为等于0
。
请勿收听UIKeyboardWillChangeFrameNotification
或任何其他键盘通知。
通过这样做,这些通知将在键盘出现或隐藏时发送,如您所料。但神奇地(我可能不会很明显地添加),当键盘的框架发生变化(用户展开/折叠QuickType)时,将调用UIKeyboardWillShowNotification
。当用户取消键盘键盘时,会触发UIKeyboardWillShowNotification
,然后会立即触发UIKeyboardWillHideNotification
。
这是通过iOS 8.4测试的,我可以想象这可能因操作系统版本而异。