【问题标题】:Objective-C: detect keyboard size/origin *before* it opens?Objective-C:在它打开之前*检测键盘大小/原点?
【发布时间】:2015-10-28 09:49:44
【问题描述】:

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

【问题讨论】:

  • 正在尝试调整超级视图以显示选定的输入?如果是,您正在使用 UIScrollView,不是吗?
  • 正在尝试调整文本框的高度,该高度应根据手机的大小而变化。
  • 我可以很容易地做到这一点之后键盘显示,但我不希望它动画。我希望在盒子实际出现之前确定盒子的大小
  • 那么,你试过UIKeyboardWillShowNotification吗?
  • 是的 - 我已经尝试过 UIKeyboardWillShowNotification,但我认为这不能解决我尝试确定键盘高度并根据此高度调整 UIView 的问题 before 它显示

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


【解决方案1】:

keyboardWillShow 在键盘显示之前被触发。如果这对您不满意,那么您需要对键盘尺寸保持警惕。

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

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

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

【讨论】:

  • 谢谢 - 我试图避免硬编码键盘值
  • 我想我想出了一个解决方法。这并不令人惊奇,但它应该可以完全满足您的需求。
【解决方案2】:

目前键盘显示的时间为 0.3 秒,但 Apple 可能随时更改此设置。键盘尺寸也是如此。纵向模式下的默认键盘高度为 216 像素,横向模式下为 162 像素,但也可能随时更改。如果(出于任何原因)您需要找出键盘尺寸,您可以很容易地做到这一点。

   [[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));
    }

【讨论】:

  • 好吧,大小不是 216 px,因为键盘可能包含字典(从 iOS8 及更高版本),用户可以随时更改。如果用户将关闭或打开字典,通知将再次触发,键盘矩形将包含新的相关值。
猜你喜欢
  • 1970-01-01
  • 2015-08-24
  • 2013-02-14
  • 2016-02-20
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2013-04-17
  • 2011-07-16
相关资源
最近更新 更多