【问题标题】:Getting UIKeyboard Height When TextField ShowsTextField 显示时获取 UIKeyboard 高度
【发布时间】:2014-11-13 05:02:31
【问题描述】:

我有几个 UITextFields 在弹出时会被键盘隐藏,所以我实现了 UIKeyboardWillShowNotificationUIKeyboardWillHideNotification 并将它们发送到各自的方法:

- (void)keyboardWillShow:(NSNotification*)notification
{
    CGFloat height = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    keyBoardHeight = height;
}

- (void)keyboardWillHide:(NSNotification*)notification
{
    CGFloat height = [[notification.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    keyBoardHeight = height;
}

然后我将我的文本字段委托给此方法:

//TextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    float keyboardOffset = [self offsetForKeyboard:textField.frame.origin.y withHeight:textField.frame.size.height];
    NSLog(@"%f, %f", keyBoardHeight, keyboardOffset);

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.1];
    self.view.frame = [Global rect:self.view.frame withNewY:-[self offsetForKeyboard:textField.frame.origin.y withHeight:textField.frame.size.height]];
    [UIView commitAnimations];
}

代码运行正常,但是当我运行代码时,keyboardWillShow: 方法在textFieldDidBeginEditing: 方法之后运行。正因为如此,keyboardHeight 在代码第一次运行时被设置为 0,所以我计算的偏移量是很远的。

如何使keyboardWillShow: 方法textFieldDidBeginEditing: 方法之前运行?我可以使用其他委托方法吗?

【问题讨论】:

  • @rmaddy 是的,这就是我查找的问题,它激发了我为任何文本字段编写一个包罗万象的内容。不过我想通了。谢谢您的帮助! :)

标签: ios objective-c delegates uitextfield uikeyboard


【解决方案1】:

抱歉,没有办法。您必须在 在通知观察者内 中制作动画或为键盘处理所做的任何事情。 这是 Apple 推荐的,并且在我迄今为止遇到的所有情况下都适用。

Apple's Keyboard Guide

【讨论】:

    【解决方案2】:

    对于其他尝试这样做的人,我找到了一种方法:

    保持对当前编辑文本字段的弱引用:

    UITextField* editingTextField;
    
    - (void)textFieldDidBeginEditing:(UITextField*)textField
    {
        editingTextField = textField;
    }
    
    - (void)textFieldDidEndEditing:(UITextField*)textField
    {
        editingTextField = nil;
    }
    

    然后只需在 keyboardWillShow: 方法中打开弱文本字段时引用它即可计算适当的偏移量并相应地移动视图。

    - (void)keyboardWillShow:(NSNotification*)notification
    {
        //Use editingTextField's frame here
    }
    

    【讨论】:

    • 这就是我在上面的回答中所说的。
    【解决方案3】:

    只需使用 IQKeyboardManager。它是任何视图中所有文本字段的单行代码。链接:https://github.com/hackiftekhar/IQKeyboardManager

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      相关资源
      最近更新 更多