keyboardWillShow 是在键盘显示之前被触发。如果这对您不满意,那么您需要对键盘尺寸保持警惕。
如果键盘之前从未在您的应用程序的屏幕上显示过,您可以先检查device type 和orientation,然后快速查找default keyboard sizes 表,从而做出有根据的猜测。这将覆盖您 99% 的时间。
如果用户使用的自定义键盘不是标准尺寸,您可以使用keyboardWillShow 中的键盘尺寸,存储它和方向(NSUserDefaults 在这里可以很好地工作)然后参考下次需要大小时存储的值。
这不会每次都满足您的需求,因为在调用 keyboardWillShow 之前您不会知道要拉起哪个键盘。例如,您可以将两个不同的UITextField 上的inputView 替换为您自己的自定义视图;这些视图的大小可能不同。在调用keyboardWillShow 之前,您不会知道要显示哪一个。
编辑
还有另一种可能性...如果您知道要明确显示键盘的视图。
我将此添加到viewDidLoad:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShowFirstTimeNotification:)
name:UIKeyboardWillShowNotification
object:nil];
[self.view addSubview:self.textField];
[self.textField becomeFirstResponder];
然后,添加处理该通知的方法。此方法应该只被调用一次,然后在其中删除通知,这样就不会再调用它了。
- (void)keyboardWillShowFirstTimeNotification:(NSNotification*)notification {
NSDictionary* keyboardInfo = [notification userInfo];
NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
NSLog(@"keyboardFrameBeginRectHeight: %f", keyboardFrameBeginRect.size.height);
[[NSNotificationCenter defaultCenter] removeObserver:self];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow)
name:UIKeyboardWillShowNotification
object:nil];
[self.textField resignFirstResponder];
}
这将记录键盘高度,而不会在屏幕上显示。
如果您想进一步扩展它,您可以将UITextField 和UITextView 子类化为具有不同方向的键盘高度属性,然后您可以将该值直接存储在文本字段和文本视图中。然后,您将能够有多个输入视图大小,并在显示它们之前知道它们将是什么。