您的位置:首页 > 移动开发 > IOS开发

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

2015-01-08 11:27 239 查看
键盘弹出后遮挡了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 CGRect
UIKIT_EXTERN NSString *const UIKeyboardFrameEndUserInfoKey NS_AVAILABLE_IOS(3_2); // NSValue of CGRect
UIKIT_EXTERN NSString *const UIKeyboardAnimationDurationUserInfoKey NS_AVAILABLE_IOS(3_0); // NSNumber of double
UIKIT_EXTERN NSString *const UIKeyboardAnimationCurveUserInfoKey NS_AVAILABLE_IOS(3_0); // NSNumber of NSUInteger (UIViewAnimationCurve)

UIKeyboardFrameBeginUserInfoKey和UIKeyboardFrameEndUserInfoKey描述的是两种不同的状态,键盘大小要发生变化时,Begin代表的是变化之前的状态,End代表的是变化之后的状态,所以这个地方小心不要弄混。
这个场景中,我们希望的是键盘高度变化之后,view相应的做出变化,因此取的是End状态。

代码中的keyBoardSize即代表了键盘的宽,高。然后你就可以根据键盘的大小,改变你想改变的view位置了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 键盘上移 keyboard