Objective-C:在*打开之前检测键盘大小/原点*?

时间:2015-08-05 14:35:37

标签: ios objective-c cocoa-touch user-interface

这是怎么做到的?我正在寻找iOS7 / 8解决方案。 keyboardWillShow不能令人满意,因为我需要在键盘实际显示之前根据键盘高度调整视图大小。

2 个答案:

答案 0 :(得分:1)

在显示键盘之前,

keyboardWillShow 如果这对您不满意,那么您需要对键盘大小保持警惕。

如果以前从未在您的应用中显示过键盘,您可以首先检查device typeorientation,然后快速查找{{{ 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];
}

这将记录键盘高度,而不会在屏幕上显示。

如果您想进一步扩展,可以将UITextFieldUITextView子类化为不同方向的键盘高度属性,然后可以将该值直接存储在文本字段和文本视图中。然后,您将能够拥有多个输入视图大小,并在显示它们之前知道它们将会是什么。

答案 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));
    }