键盘弹出后输入框上移的解决方案
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位置了。
这种方式能够解决键盘弹出之后键盘高度发生变化(例如中文键盘,输入字母之后最上面会多出一块候选单词的区域),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 键盘遮挡输入框 视图上移解决方案
- ionic3 footer上添加输入框,弹出键盘时,整个页面全部上移问题
- [Cordova/Phonegap] Cordova iOS 应用在第三方输入法的键盘弹出(点击输入框)时,页面不上移,导致输入框被键盘遮挡 的解决办法
- 输入框弹出键盘时自动上移
- 点击输入框弹出键盘布局上移
- Android安卓WebApp中 全屏和普通模式下 webview中软键盘弹出挡住输入框 解决方案
- UIWebView中输入框不能弹出键盘的解决方案
- 解决webview中输入框完成输入隐藏键盘后滑动界面又弹出软键盘问题
- android软键盘弹出引起的各种不适终极解决方案
- Android爬坑之旅:软键盘挡住输入框问题的终极解决方案
- Android软键盘弹出,界面整体上移的问题
- 仿朋友圈评论弹出键盘,同时在键盘上弹出输入框
- Android软键盘弹出,界面整体上移的问题【转】
- 键盘弹出后,输入框自动弹到最顶部
- 弹出键盘时遮挡输入框的问题解决
- webview的input输入框获取焦点弹出数字键盘
- iOS UITextField输入框随键盘弹出界面上移
- android 弹出的软键盘遮挡住EditText文本框的解决方案
- [Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,运行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决办法