iOS键盘高度改变

iOS键盘高度适配界面

在UITextField 和 UITextView进行文本输入的时候会在第一响应者的时候弹出键盘,而在对底部的输入文本框或者其他视图的布局时,键盘的弹出常常会遮挡住文本框,使得用户的体验降低。而在开发中就需要根据键盘的弹出对视图的约束进行更改从而达到提升用户的体验的目的。

UITexView和UITextField响应过程

在键盘的响应过程中一般是在输入框的流程中进行,在代码的实现过程中需要借助其对应的代理协议UITextFieldDelegate或UITextViewDelegate中的方法来调用键盘的响应事件。
以UITextView为例,在UITextFieldDelegate的代理方法中,让textView成为第一响应者即可调用出键盘事件(若是UITextField即换成UITextField为第一响应者调用出键盘)
用代码展示,UITexView的代理的实现

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView{
    [self.textView becomeFirstResponder];
    return YES;
}
// 是否应该开始编辑
- (void)textViewDidBeginEditing:(UITextView *)textView{}
// 已经开始编辑
- (void)textViewDidEndEditing:(UITextView *)textView{}
// 结束编辑
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{
    return YES;
}
// 文本改变是否显示
- (void)textViewDidChange:(UITextView *)textView{}
// 文本已经改变
- (void)textViewDidChangeSelection:(UITextView *)textView{}

textViewShouldBeginEditing:方法来允许或者组织其第一响应者,并控制是否对文本框进行输入成为第一响应者,[self.textView becomeFirstResponder]设置textView 为第一响应者,并且系统会根据需要发出UIKeyboardWillShowNotification 和UIKeyboardDidShowNotification的Notification通知,在键盘的通知事件中进行视图的高度变换(借助Masonry布局进行界面的改变)
系统代理调用的textViewDidBeginEditing方法,并且发出UITextViewTextDidBeginEditingNotification的通知,此时光标已经在textView中定位了,键盘也已经弹出来了,继续进行输入了
在输入信息过程中,当前文本内容改变就会调用
shouldChangeTextInRange方法会发出UITextViewTextDidChangeNotification的通知。
在文本框输入即将结束,即即将注销第一响应者时,系统会调用 textViewShouldEndEditing: 方法
文本框注销第一响应者,对应的响应时间就是系统收回键盘,并且在隐藏键盘时会发出 UIKeyboardWillHideNotification和UIKeyboardDidHideNotification的通知
最后,系统调用 textViewDidEndEditing: 方法结束输入,并发出UITextViewTextDidEndEditingNotification的通知。

收起键盘一般通过点击空白处收起键盘,即通过添加手势在手势的实现方法
[self.textView resignFirstResponder]即可以调用键盘的通知,达到键盘消失的目的。

键盘的显示和消失

键盘的通知:
UIKeyboardWillShowNotification: 显示键盘的时候立即发出该通知
UIKeyboardDidShowNotification:显示键盘后才发出该通知
UIKeyboardWillHideNotification:键盘即将消失的时候立即发出该通知
UIKeyboardDidHideNotification:键盘消失后才发出该通知
UIKeyboardWillChangeFrameNotification:键盘的frame值发生变化的时候立即发出该通知
UIKeyboardDidChangeFrameNotification:键盘的frame值发生变化后才发出该通知

在viewDidLoad中注册键盘的通知监听事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHideOrShow:) name:UIKeyboardWillShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHideOrShow:) name:UIKeyboardWillHideNotification object:nil];

对于键盘的高度,各个机型的键盘高度不相同,对此在键盘的通知事件中获取到键盘高度,在通过布局改变界面的显示,即可以达到弹起键盘的目的。

  • 在通知事件中监听键盘事件
- (void)keyboardHideOrShow:(NSNotification *)notification {
    NSString *notificationName = notification.name;     //获取通知名称
    NSDictionary *keyboardInfo = notification.userInfo;//获取通知内容
    CGFloat *height = keyboardFrame.size.height;   //为键盘的高度
    
	if ([notificationName isEqualToString:UIKeyboardWillHideNotification]) {
        //键盘将要消失
    }
    else {
        //键盘将要弹起
    }
}

键盘高度的变化一般都根据对视图的布局约束,进行实时的变换,一般都在键盘将要消失和键盘弹起的通知事件中进行实现。可以再写一个用于改变视图的方法,将键盘的高度传递到方法中去。对于视图的改变建议使用masonry进行重新约束(使用mas_remakeConstraints重新布局可以减少踩坑)

键盘通知

可以在源码中阅读到键盘的所有通知

UIKIT_EXTERN NSNotificationName const UIKeyboardWillShowNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidShowNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardWillHideNotification __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidHideNotification __TVOS_PROHIBITED;

UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey        NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED; // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey          NS_AVAILABLE_IOS(3_2) __TVOS_PROHIBITED; // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // NSNumber of double
UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey    NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; // NSNumber of NSUInteger (UIViewAnimationCurve)
UIKIT_EXTERN NSString *const UIKeyboardIsLocalUserInfoKey           NS_AVAILABLE_IOS(9_0) __TVOS_PROHIBITED; // NSNumber of BOOL

// Like the standard keyboard notifications above, these additional notifications include
// a nil object and begin/end frames of the keyboard in screen coordinates in the userInfo dictionary.
UIKIT_EXTERN NSNotificationName const UIKeyboardWillChangeFrameNotification  NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;
UIKIT_EXTERN NSNotificationName const UIKeyboardDidChangeFrameNotification   NS_AVAILABLE_IOS(5_0) __TVOS_PROHIBITED;

// These keys are superseded by UIKeyboardFrameBeginUserInfoKey and UIKeyboardFrameEndUserInfoKey.
UIKIT_EXTERN NSString *const UIKeyboardCenterBeginUserInfoKey   NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
UIKIT_EXTERN NSString *const UIKeyboardCenterEndUserInfoKey     NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;
UIKIT_EXTERN NSString *const UIKeyboardBoundsUserInfoKey        NS_DEPRECATED_IOS(2_0, 3_2) __TVOS_PROHIBITED;

键盘的通知调用顺序
键盘通知的发出顺序,当一个UITextView或UITextField变成第一响应时,通知的发出顺序如下:UIKeyboardWillChangeFrameNotification、UIKeyboardWillShowNotification、UIKeyboardDidChangeFrameNotification、UIKeyboardDidShowNotification。

当一个UITextView或UITextField注销第一响应时,发出通知顺序如下:UIKeyboardWillChangeFrameNotification、UIKeyboardWillHideNotification、UIKeyboardDidChangeFrameNotification、UIKeyboardDidHideNotification。

特别需要注意的是,当屏幕旋转的时候也会发出键盘通知,并且顺序如下:UIKeyboardWillChangeFrameNotification、UIKeyboardWillHideNotification、UIKeyboardDidChangeFrameNotification、UIKeyboardDidHideNotification、UIKeyboardWillChangeFrameNotification、UIKeyboardWillShowNotification、UIKeyboardDidChangeFrameNotification、UIKeyboardDidShowNotification。其顺序是一个UITextView或UITextField注销第一响应时,发出键盘通知顺序和一个UITextView或UITextField变成第一响应时发出键盘顺序组合起来一致,也就是说,在屏幕旋转期间,虽然看起来好像键盘没啥变化,但实际上通知已经经理了从“消失”到再次“显示”的路径了。所以,平时如果需要捕获键盘通知处理一些业务逻辑的话,需要特别注意通知的顺序,小心谨慎,避免意外的错误。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值