【发布时间】:2014-09-25 09:26:25
【问题描述】:
大家可能都知道键盘上的新快速输入栏。
在我的应用程序中,我在键盘上放置了一个自定义 TextView 栏。但是由于 QuickType Bar ,我的文本视图被隐藏了。
我想知道,有没有什么属性或方法可以知道QuickType Bar是否打开?
【问题讨论】:
标签: ios8 uikeyboard quicktypebar
大家可能都知道键盘上的新快速输入栏。
在我的应用程序中,我在键盘上放置了一个自定义 TextView 栏。但是由于 QuickType Bar ,我的文本视图被隐藏了。
我想知道,有没有什么属性或方法可以知道QuickType Bar是否打开?
【问题讨论】:
标签: ios8 uikeyboard quicktypebar
没有什么可以告诉您 QuickType 栏是否处于活动状态,但您可以使用此代码注册UIKeyboardWillChangeFrameNotification 通知,然后您可以获得有关键盘高度的信息。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
使用传递的userInfo 字典中的UIKeyboardFrameBeginUserInfoKey 和UIKeyboardFrameEndUserInfoKey 值来检索键盘的当前和未来帧。可以参考以下代码。
- (void)keyboardWillChangeFrame:(NSNotification*)notification
{
NSDictionary* keyboardInfo = [notification userInfo];
NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
// Manage your other frame changes
}
希望这会有所帮助。每次键盘更改其框架时都会调用它。
【讨论】:
正如其他答案所建议的那样,UIKeyboardWillChangeFrameNotification 将在每次键盘获得新框架时触发。这包括键盘何时显示和隐藏,以及 QuickType 栏何时显示和隐藏。
问题是,这与UIKeyboardWillShowNotification 完全相同,只是名称不同。 因此,如果您已经为 UIKeyboardWillShowNotification 实现了一个方法,那么您就可以开始了。
但有一个例外。当您在处理UIKeyboardWillShowNotification 的方法中获取键盘框架时,您必须确保通过UIKeyboardFrameEndUserInfoKey 而不是UIKeyboardFrameBeginUserInfoKey 访问它.否则,它会在键盘显示/隐藏时得到正确的框架,但在 QuickType 栏显示时不会。
因此,处理UIKeyboardWillShowNotification 的方法中的代码应如下所示(在 Swift 中):
func keyboardWillShow(notification: NSNotification) {
let info = notification.userInfo!
keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
keyboardRect = yourView.convertRect(keyboardRect, fromView: nil)
// Handling the keyboard rect by changing frames, content offsets, constraints, or whatever
}
【讨论】:
- (void)keyboardFrameChanged:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGPoint from = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].origin;
CGPoint to = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin;
float height = 0.0f;
if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) {
height = to.x - from.x;
} else {
height = to.y - from.y;
}
[self setContentSize:CGSizeMake(self.frame.size.width, self.frame.size.height + height)];
}
【讨论】: