键盘弹出后输入框上移的解决方案

来源:互联网 发布:淘宝刷手违法吗 编辑:程序博客网 时间:2024/06/03 17:41

键盘弹出后遮挡了textField是一种非常常见的情况,解决方案有很多种,我在这里介绍其中一种方式。

这种方式能够解决键盘弹出之后键盘高度发生变化(例如中文键盘,输入字母之后最上面会多出一块候选单词的区域),textField或view的位置变化。

首先对controller添加消息监听。

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

notification的name是系统预设的值。该值常用的有以下四种:

UIKIT_EXTERN NSString *const UIKeyboardWillShowNotification;UIKIT_EXTERN NSString *const UIKeyboardDidShowNotification; UIKIT_EXTERN NSString *const UIKeyboardWillHideNotification; UIKIT_EXTERN NSString *const UIKeyboardDidHideNotification;

分别代表了键盘将要显示,显示完成,将要隐藏,隐藏完成的四个状态。

根据需要选择你要处理的状态,但如果对UIKeyboardWillShowNotification添加监听,在处理view位置变化的时候可能会因为系统自带的键盘动画导致失效。

接下来是消息的处理:

#pragma mark - Notification- (void)keyboardDidShow:(NSNotification *)noti{    NSDictionary *info = [noti userInfo];    NSValue *aValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];        CGSize keyBoardSize = [aValue CGRectValue].size;    CGRect rect = _bottomBarV.frame;    rect.origin.y = self.view.frame.size.height - keyBoardSize.height - rect.size.height;    _bottomBarV.frame = rect;}- (void)keyboardWillHide:(NSNotification *)noti{    CGRect rect = _bottomBarV.frame;    rect.origin.y = self.view.frame.size.height - rect.size.height;    _bottomBarV.frame = rect;}

首先,这段代码需要你根据需要自己做一些调整。我贴出来的这段代码适用的场景是一个位于屏幕最下方的view(_bottemBarV)当键盘弹起时,位移到键盘最上方。

其次,在show消息处理中,取到了一个key值为UIKeyboardFrameEndUserInfoKey。

该值为系统预设:

UIKIT_EXTERN NSString *const UIKeyboardFrameBeginUserInfoKey        NS_AVAILABLE_IOS(3_2); // NSValue of CGRectUIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey          NS_AVAILABLE_IOS(3_2); // NSValue of CGRectUIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey NS_AVAILABLE_IOS(3_0); // NSNumber of doubleUIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey    NS_AVAILABLE_IOS(3_0); // NSNumber of NSUInteger (UIViewAnimationCurve)

UIKeyboardFrameBeginUserInfoKey和UIKeyboardFrameEndUserInfoKey描述的是两种不同的状态,键盘大小要发生变化时,Begin代表的是变化之前的状态,End代表的是变化之后的状态,所以这个地方小心不要弄混。

这个场景中,我们希望的是键盘高度变化之后,view相应的做出变化,因此取的是End状态。

代码中的keyBoardSize即代表了键盘的宽,高。然后你就可以根据键盘的大小,改变你想改变的view位置了。

0 0
原创粉丝点击