iOS键盘高度

1、键盘的自带通知 (见名知意)

UIKeyboardWillShowNotification 键盘将要显示

UIKeyboardDidShowNotification  键盘显示完毕

UIKeyboardWillHideNotification 键盘将要隐藏

UIKeyboardDidHideNotification  键盘完成隐藏

UIKeyboardWillChangeFrameNotification 键盘frame将要改变

UIKeyboardDidChangeFrameNotification  键盘frame完成改变

(frame改变不论是显示还是隐藏都会发送该通知)

注册:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];

其他类似。

2、细节

ios5之前,iphone上的键盘的高度是固定为216.0px高的,中文汉字的选择框是悬浮的,所以不少应用都将此高度来标注键盘的高度。但显然这是不合理的。

在开发中其实这些通知并不能按照你所想的那样发生,要注意以下几点:

1. 当在英文和中文输入法之间切换时,iPhone中并不会产生UIKeyboardWillChangeFrameNotification和UIKeyboardDidChangeFrameNotification通知,而iPad中会产生。
2. ChangeFrame Notification会发生在Show或Hide Notification之前。
3. 在iPad中分割键盘会有Hide Notification,合并键盘时才有Show Notification。分割时键盘竟然是隐藏的。


3、使用

#pragma mark - 注册通知

- (void)addNotification

{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardDidHideNotification object:nil];

}

#pragma mark - UIKeyboardNotification

/* 键盘显示*/

- (void)keyboardShow:(NSNotification *)notification

{

    NSDictionary* info = [notification userInfo];

    float duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];

    CGFloat keyboardHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;

    [UIView animateWithDuration:duration animations:^{

        self.rootView.y = 0;

//因为在textField代理方法中写了alert,故键盘显示后又会隐藏,alert点击关闭后键盘会再次弹出,此时就会上移都一次,并且当键盘发生改变的时候也会发送show的通知,会多次调用

        self.rootView.frame.origin.-= keyboardHeight;//重新设置上移高度

    }];

}

/* 键盘隐藏*/

- (void)keyboardHide:(NSNotification *)notification

{

    NSDictionary* info = [notification userInfo];

    float duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];

    CGFloat keyboardHeight = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;

    [UIView animateWithDuration:duration animations:^{

        self.rootView.frame.origin.y += keyboardHeight;

    }];

}

/* 移除通知*/

[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];


如果只有一个text输入框可以在 textFieldDidEndEditing 这个方法中移除通知,如果有多个输入框就不要这样做了


下面说一下text输入框的两个代理方法和键盘通知之间的先后顺序

UIKeyboardWillShowNotification (did)

- (void)textFieldDidBeginEditing

- (void)textFieldDidEndEditing

UIKeyboardWillHideNotification (did)

从上至下依次执行。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值