繁体   English   中英

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

[英]How to calculate keyboard height in iOS?

我知道这个问题被问过很多次,但是我不知道我在哪里犯错。 简单来说,我无法正确实现它。

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

我知道我需要执行以下步骤:

  1. 注册观察员
  2. 有计算我可以从中获取高度的键盘矩形的例程
  3. 键盘上的显示和隐藏都有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的子类中完成。

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];
}

可以让您恢复键盘的高度。

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将具有正确的大小。


注意:这不是处理键盘外观的完整实现,如果您需要复杂的想法,请在此处检查我完整且可接受的答案 (stackoverflow.com内部链接)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM