如何在 iOS 中计算键盘高度?

Posted

技术标签:

【中文标题】如何在 iOS 中计算键盘高度?【英文标题】:How to calculate keyboard height in iOS? 【发布时间】:2014-12-02 09:29:37 【问题描述】:

我知道这个问题被问了很多次,但我不知道我在哪里犯错了。简而言之,我无法正确实施它。

我的应用程序必须在 iPhone 和 iPad 上运行(仅限纵向)。我有一个子类UITextField。当它在编辑过程中被键盘隐藏时,我需要将它向上移动。 我无法正确设置它,因为键盘大小的计算是在它进入编辑模式后完成的。

我知道我需要以下步骤:

    注册观察者 具有计算键盘矩形的例程,我可以从中获取高度 在键盘的显示和隐藏上有 2 个事件来偏移我的自定义文本字段。

请告诉我哪里错了。

我的代码是:

注册观察者:

- (id)initWithCoder:(NSCoder *)aDecoder
    if (self = [super initWithCoder:aDecoder]) 
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillShowNotification object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardDidShowNotification object:nil];
        _leftInlineImage = NO;
    
    return self;

计算键盘高度:

- (void)keyboardWillChange:(NSNotification *)notification 
    NSDictionary* d = [notification userInfo];
    CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    r = [self.superview convertRect:r fromView:nil];
    _keyboardHeight = r.size.height;

显示/隐藏键盘:

/* Move keyboard */
-(void)showKeyboardWithMove 

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    ////CGFloat screenWidth = screenRect.size.width;
    CGFloat screenHeight = screenRect.size.height;

    //_keyboardHeight = KEYBOARD_HEIGHT;

    if (self.frame.origin.y + self.frame.size.height > screenHeight - _keyboardHeight) 
        double offset = screenHeight - _keyboardHeight - self.frame.origin.y - self.frame.size.height;
        CGRect rect = CGRectMake(0, offset, self.superview.frame.size.width, self.superview.frame.size.height);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3];

        self.superview.frame = rect;

        [UIView commitAnimations];
    



-(void)hideKeyboardWithMove 

    CGRect rect = CGRectMake(0, 0, self.superview.frame.size.width, self.superview.frame.size.height);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    self.superview.frame = rect;

    [UIView commitAnimations];


之前计算过,我的身高是0。这一切都是在UITextField的子类中完成的。

【问题讨论】:

How to get UIKeyboard size with Apple iPhone SDK 的可能重复项 我知道这是重复的@Chan,但我无法实现它,这就是我问这个问题的原因。 但是为了让键盘出现,一个可编辑的 UI 元素需要获得焦点。所以我不明白为什么会出现混乱? 请检查这个答案:***.com/questions/23988866/… 我很抱歉@Lefteris,但我不明白你的话。当然首先文本字段必须获得焦点。我的问题是当它获得焦点时showKeyboardWithMove 被调用,然后keyboardWillChange,这导致键盘高度= 0,即我什么都不做。 【参考方案1】:

UIKeyboardWillChangeFrameNotification的观察者添加到viewDidLoad

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameDidChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

这个方法对你有帮助:

- (void)keyboardFrameDidChange:(NSNotification *)notification

    CGRect keyboardEndFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect keyboardBeginFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    UIViewAnimationCurve animationCurve = [[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    NSTimeInterval animationDuration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] integerValue];

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    CGRect newFrame = self.view.frame;
    CGRect keyboardFrameEnd = [self.view convertRect:keyboardEndFrame toView:nil];
    CGRect keyboardFrameBegin = [self.view convertRect:keyboardBeginFrame toView:nil];

    newFrame.origin.y -= (keyboardFrameBegin.origin.y - keyboardFrameEnd.origin.y);
    self.view.frame = newFrame;

    [UIView commitAnimations];

【讨论】:

您的解决方案正在运行。我只想说一句——它总是移动整个屏幕,如果你的控件在顶部,这可能是个问题。所以必须做一些检查。我的错误是我想在 UITextField 的子类中实现我的目标。 此解决方案在 ios 8 上运行良好,但在 iOS 7 中,keyboardFrameEnd 和 keyboardFrameBegin 最终得到了一些疯狂的负值/错误值。我发现,如果我将 convertRect 调用更改为 fromView: 变体,它就会开始对两者都起作用。【参考方案2】:

这会让您恢复键盘的高度。

NSNotification * note = // ... the notification you receive via UIKeyboardWillShowNotification
id _obj = [note.userInfo valueForKey:@"UIKeyboardBoundsUserInfoKey"];
CGRect _keyboardBound = CGRectNull;
if ([_obj respondsToSelector:@selector(getValue:)]) [_obj getValue:&_keyboardBound];

_keyboardBound 将具有正确的大小。


注意:这不是处理键盘外观的完整实现,如果您需要复杂的想法,请查看my complete and accepted answer here (***.com 内部链接)

【讨论】:

以上是关于如何在 iOS 中计算键盘高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改iOS自定义键盘的高度?

移动网络 - 如何在键盘打开时获取屏幕高度

如何在 Web 应用程序上获取键盘高度

H5如何对android和ios手机软键盘的监听

移动端H5软键盘的问题

计算从键盘高度 UITableview 向上滚动多少