这是怎么做到的?我正在寻找iOS7 / 8解决方案。 keyboardWillShow不能令人满意,因为我需要在键盘实际显示之前根据键盘高度调整视图大小。
答案 0 :(得分:1)
keyboardWillShow
如果这对您不满意,那么您需要对键盘大小保持警惕。
如果以前从未在您的应用中显示过键盘,您可以首先检查device type和orientation,然后快速查找{{{ 3}}。这将占99%的时间。
如果用户使用的自定义键盘不是标准尺寸,您可以使用keyboardWillShow
中的键盘大小,存储它,方向(NSUserDefaults
在这里可以正常使用)然后在下次需要大小时引用存储的值。
这不会满足您的每次需求,因为在调用keyboardWillShow
之前您不知道哪个键盘会被拉起来。例如,您可以使用自己的自定义视图替换两个不同inputView
上的UITextField
;这些观点可能有不同的大小。在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
子类化为不同方向的键盘高度属性,然后可以将该值直接存储在文本字段和文本视图中。然后,您将能够拥有多个输入视图大小,并在显示它们之前知道它们将会是什么。
答案 1 :(得分:0)
目前键盘显示的时间是0.3秒,但Apple可能会随时更改。对于键盘尺寸也是如此。 portait模式下的默认键盘高度为216px,横向为162px,但也可能随时更改。如果(出于任何原因)你需要找出键盘大小,你可以很容易地做到这一点。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
// Read the userInfo for the key UIKeyboardFrameBeginUserInfoKey
-(void)keyboardWillShow:(NSNotification*)notification {
NSDictionary* keyboardInfo = [notification userInfo];
NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
NSLog(@"%@", NSStringFromCGRect(keyboardFrameBeginRect));
}