ios 键盘事件处理
2014-03-06 16:42
417 查看
App应用中,难免会需要用户输入一些相关数据。
于是就用到键盘。
键盘在iPhone和iPad中,类似是一个View的形式来显示和隐藏。
当一个输入框得到焦点时,系统会默认调用键盘事件。来显示键盘;当输入框失去焦点时,键盘会消失。
那么,键盘事件有一下4种:
UIKIT_EXTERN
NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN
NSString *constUIKeyboardDidShowNotification;
UIKIT_EXTERN
NSString *constUIKeyboardWillHideNotification;
UIKIT_EXTERN
NSString *const UIKeyboardDidHideNotification;
1.注册键盘事件:
-(void)viewWillAppear:(BOOL)paramAnimated{
[super
viewDidAppear:paramAnimated];
//在通知中心注册观察者,并指定观察者感兴趣的事件
//
键盘将要显示时
NSNotificationCenter
*center = [NSNotificationCenterdefaultCenter];
[center
addObserver:self
selector:@selector(handleKeyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//
键盘将要隐藏时
[center
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
2.键盘事件执行的方法:
//键盘出现时,调用该方法
-(void)handleKeyboardWillShow:(NSNotification *)paramNotification{
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
UIWindow
*window = [[[UIApplication sharedApplication] delegate] window];//获得window
//
得到window.frame和键盘frame的交集
CGRectintersectionOfKeyboardRectAndWindowRect =
CGRectIntersection(window.frame, keyboardEndRect);
CGFloat bottomInset =intersectionOfKeyboardRectAndWindowRect.size.height;
self.myTableView.contentInset =
UIEdgeInsetsMake(0.0f,0.0f,bottomInset,0.0f);
NSIndexPath *indexPathOfOwnerCell =nil;
//保证得到焦点的UITextField(文本框)也显示在屏幕上
NSInteger numberOfCells = [self.myTableView.dataSource
tableView:self.myTableView
numberOfRowsInSection:0];
//
循环,并且得到获得焦点的UITextField(文本框)所在的UITableViewCell中的NSIndexPath信息,并滚动TableView到相应的位置
for (NSInteger counter =
0;counter <numberOfCells;counter++){
NSIndexPath*indexPath = [NSIndexPathindexPathForRow:counterinSection:0];
UITableViewCell *cell = [self.myTableView
cellForRowAtIndexPath:indexPath];
UITextField*textField = (UITextField*)cell.accessoryView;
if([textField isKindOfClass:[UITextField
class]] == NO){
continue;
}
if([textField isFirstResponder]){
indexPathOfOwnerCell = indexPath;
break;
}
}
[UIViewcommitAnimations];
//
滚动TableView到相应的位置
if (indexPathOfOwnerCell != nil){
[self.myTableView
scrollToRowAtIndexPath:indexPathOfOwnerCell
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
}
//键盘将要消失时,执行该方法
-(void)handleKeyboardWillHide:(NSNotification *)paramNotification{
//
比较两个EdgeInsets是否相等
if(UIEdgeInsetsEqualToEdgeInsets(self.myTableView.contentInset,
UIEdgeInsetsZero)){
//
无需设置TableView的contentInset
return;
}
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
self.myTableView.contentInset
= UIEdgeInsetsZero;
[UIViewcommitAnimations];
}
3.取消键盘事件
//关于观察者,什么时候添加?什么时候移除?
// 添加应该在页面载入后,一般是:viewDidLoad,viewWillAppear方法中。
//移除应该在viewWillDisappear方法中。因为,应该养成这么一个好习惯:当某个ViewController不在屏幕上显示时,应该及时将观察者移除。
-(void)viewWillDisappear:(BOOL)paramAnimated{
[super
viewDidDisappear:paramAnimated];
//移除观察者,当移除观察者时,观察者所注册的观察事件也会被
15906
移除。
//从通知中心移除某个通知观察者的所有通知项。换句话说:将观察者注册的所有通知项从通知中心移除。
//
当然,也可以使用removeObserver:name:object:方法,来单个移除。
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
4.小技巧
隐藏键盘,还有个方法
//当点击键盘Return按钮时,将触发该方法
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];//放弃第一响应者。
return YES;
}
最后,附上完整源代码:
MoreViewController.h
#import
@interface MoreViewController :UIViewController<</span>UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>{
}
@property (nonatomic,retain)
UITableView *myTableView;
@end
MoreViewController.m
#import"MoreViewController.h"
@implementationMoreViewController
@synthesize myTableView;
-(id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle*)nibBundleOrNil
{
self = [super
initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custominitialization
}
return self;
}
-(void)dealloc{
[super
dealloc];
}
-(void)viewDidLoad{
[superviewDidLoad];
self.view.backgroundColor
= [UIColor whiteColor];
self.myTableView
=[[UITableViewalloc]initWithFrame:self.view.boundsstyle:UITableViewStyleGrouped];
[self.myTableView setDataSource:self];
[self.myTableView
setDelegate:self];
self.myTableView.autoresizingMask
= UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[self.view
addSubview:self.myTableView];
}
//当点击键盘Return按钮时,将触发该方法
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];//放弃第一响应者。
return YES;
}
#pragma mark- UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section{
return 100;
}
-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{
UITableViewCell *result = nil;
static NSString *CellIdentifier =
@"CellIdentifier";
result = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
if (result == nil){
result =[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];
result.selectionStyle
=UITableViewCellSelectionStyleNone;
}
result.textLabel.text = [NSString
stringWithFormat:
@"Cell %ld", (long)indexPath.row];
CGRect accessoryRect = CGRectMake(0.0f,
0.0f,150.0f,31.0f);
UITextField *accesssory = [[UITextField
alloc] initWithFrame:accessoryRect];
accesssory.borderStyle=UITextBorderStyleRoundedRect;
accesssory.contentVerticalAlignment
=UIControlContentVerticalAlignmentCenter;
accesssory.placeholder =
@"Enter Text";
accesssory.delegate =
self;
result.accessoryView = accesssory;
return result;
}
-(void)viewDidUnload{
[selfsetMyTableView:nil];
[superviewDidUnload];
}
-(void)viewWillAppear:(BOOL)paramAnimated{
[super
viewDidAppear:paramAnimated];
//在通知中心注册观察者,并指定观察者感兴趣的事件
//
键盘将要显示时
NSNotificationCenter
*center = [NSNotificationCenterdefaultCenter];
[center
addObserver:self
selector:@selector(handleKeyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//
键盘将要隐藏时
[center
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
//关于观察者,什么时候添加?什么时候移除?
// 添加应该在页面载入后,一般是:viewDidLoad,viewWillAppear方法中。
//移除应该在viewWillDisappear方法中。因为,应该养成这么一个好习惯:当某个ViewController不在屏幕上显示时,应该及时将观察者移除。
-(void)viewWillDisappear:(BOOL)paramAnimated{
[super
viewDidDisappear:paramAnimated];
//移除观察者,当移除观察者时,观察者所注册的观察事件也会被移除。
//从通知中心移除某个通知观察者的所有通知项。换句话说:将观察者注册的所有通知项从通知中心移除。
//
当然,也可以使用removeObserver:name:object:方法,来单个移除。
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
//键盘出现时,调用该方法
-(void)handleKeyboardWillShow:(NSNotification *)paramNotification{
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
UIWindow
*window = [[[UIApplication sharedApplication] delegate] window];//获得window
//
得到window.frame和键盘frame的交集
CGRectintersectionOfKeyboardRectAndWindowRect =
CGRectIntersection(window.frame, keyboardEndRect);
CGFloat bottomInset =intersectionOfKeyboardRectAndWindowRect.size.height;
self.myTableView.contentInset =
UIEdgeInsetsMake(0.0f,0.0f,bottomInset,0.0f);
NSIndexPath *indexPathOfOwnerCell =nil;
//保证得到焦点的UITextField(文本框)也显示在屏幕上
NSInteger numberOfCells = [self.myTableView.dataSource
tableView:self.myTableView
numberOfRowsInSection:0];
//
循环,并且得到获得焦点的UITextField(文本框)所在的UITableViewCell中的NSIndexPath信息,并滚动TableView到相应的位置
for (NSInteger counter =
0;counter <numberOfCells;counter++){
NSIndexPath*indexPath = [NSIndexPathindexPathForRow:counterinSection:0];
UITableViewCell *cell = [self.myTableView
cellForRowAtIndexPath:indexPath];
UITextField*textField = (UITextField*)cell.accessoryView;
if([textField isKindOfClass:[UITextField
class]] == NO){
continue;
}
if([textField isFirstResponder]){
indexPathOfOwnerCell = indexPath;
break;
}
}
[UIViewcommitAnimations];
//
滚动TableView到相应的位置
if (indexPathOfOwnerCell != nil){
[self.myTableView
scrollToRowAtIndexPath:indexPathOfOwnerCell
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
}
//键盘将要消失时,执行该方法
-(void)handleKeyboardWillHide:(NSNotification *)paramNotification{
//
比较两个EdgeInsets是否相等
if(UIEdgeInsetsEqualToEdgeInsets(self.myTableView.contentInset,
UIEdgeInsetsZero)){
//
无需设置TableView的contentInset
return;
}
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
self.myTableView.contentInset
= UIEdgeInsetsZero;
[UIViewcommitAnimations];
}
#pragma mark - 旋转支持
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
// returnUIInterfaceOrientationIsLandscape(toInterfaceOrientation);
return YES;
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSInteger)supportedInterfaceOrientations
{
// returnUIInterfaceOrientationMaskLandscape;
returnUIInterfaceOrientationMaskAll;
}
@end
希望对你有所帮助!
于是就用到键盘。
键盘在iPhone和iPad中,类似是一个View的形式来显示和隐藏。
当一个输入框得到焦点时,系统会默认调用键盘事件。来显示键盘;当输入框失去焦点时,键盘会消失。
那么,键盘事件有一下4种:
UIKIT_EXTERN
NSString *const UIKeyboardWillShowNotification;
UIKIT_EXTERN
NSString *constUIKeyboardDidShowNotification;
UIKIT_EXTERN
NSString *constUIKeyboardWillHideNotification;
UIKIT_EXTERN
NSString *const UIKeyboardDidHideNotification;
1.注册键盘事件:
-(void)viewWillAppear:(BOOL)paramAnimated{
[super
viewDidAppear:paramAnimated];
//在通知中心注册观察者,并指定观察者感兴趣的事件
//
键盘将要显示时
NSNotificationCenter
*center = [NSNotificationCenterdefaultCenter];
[center
addObserver:self
selector:@selector(handleKeyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//
键盘将要隐藏时
[center
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
2.键盘事件执行的方法:
//键盘出现时,调用该方法
-(void)handleKeyboardWillShow:(NSNotification *)paramNotification{
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
UIWindow
*window = [[[UIApplication sharedApplication] delegate] window];//获得window
//
得到window.frame和键盘frame的交集
CGRectintersectionOfKeyboardRectAndWindowRect =
CGRectIntersection(window.frame, keyboardEndRect);
CGFloat bottomInset =intersectionOfKeyboardRectAndWindowRect.size.height;
self.myTableView.contentInset =
UIEdgeInsetsMake(0.0f,0.0f,bottomInset,0.0f);
NSIndexPath *indexPathOfOwnerCell =nil;
//保证得到焦点的UITextField(文本框)也显示在屏幕上
NSInteger numberOfCells = [self.myTableView.dataSource
tableView:self.myTableView
numberOfRowsInSection:0];
//
循环,并且得到获得焦点的UITextField(文本框)所在的UITableViewCell中的NSIndexPath信息,并滚动TableView到相应的位置
for (NSInteger counter =
0;counter <numberOfCells;counter++){
NSIndexPath*indexPath = [NSIndexPathindexPathForRow:counterinSection:0];
UITableViewCell *cell = [self.myTableView
cellForRowAtIndexPath:indexPath];
UITextField*textField = (UITextField*)cell.accessoryView;
if([textField isKindOfClass:[UITextField
class]] == NO){
continue;
}
if([textField isFirstResponder]){
indexPathOfOwnerCell = indexPath;
break;
}
}
[UIViewcommitAnimations];
//
滚动TableView到相应的位置
if (indexPathOfOwnerCell != nil){
[self.myTableView
scrollToRowAtIndexPath:indexPathOfOwnerCell
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
}
//键盘将要消失时,执行该方法
-(void)handleKeyboardWillHide:(NSNotification *)paramNotification{
//
比较两个EdgeInsets是否相等
if(UIEdgeInsetsEqualToEdgeInsets(self.myTableView.contentInset,
UIEdgeInsetsZero)){
//
无需设置TableView的contentInset
return;
}
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
self.myTableView.contentInset
= UIEdgeInsetsZero;
[UIViewcommitAnimations];
}
3.取消键盘事件
//关于观察者,什么时候添加?什么时候移除?
// 添加应该在页面载入后,一般是:viewDidLoad,viewWillAppear方法中。
//移除应该在viewWillDisappear方法中。因为,应该养成这么一个好习惯:当某个ViewController不在屏幕上显示时,应该及时将观察者移除。
-(void)viewWillDisappear:(BOOL)paramAnimated{
[super
viewDidDisappear:paramAnimated];
//移除观察者,当移除观察者时,观察者所注册的观察事件也会被
15906
移除。
//从通知中心移除某个通知观察者的所有通知项。换句话说:将观察者注册的所有通知项从通知中心移除。
//
当然,也可以使用removeObserver:name:object:方法,来单个移除。
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
4.小技巧
隐藏键盘,还有个方法
//当点击键盘Return按钮时,将触发该方法
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];//放弃第一响应者。
return YES;
}
最后,附上完整源代码:
MoreViewController.h
#import
@interface MoreViewController :UIViewController<</span>UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate>{
}
@property (nonatomic,retain)
UITableView *myTableView;
@end
MoreViewController.m
#import"MoreViewController.h"
@implementationMoreViewController
@synthesize myTableView;
-(id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle*)nibBundleOrNil
{
self = [super
initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custominitialization
}
return self;
}
-(void)dealloc{
[super
dealloc];
}
-(void)viewDidLoad{
[superviewDidLoad];
self.view.backgroundColor
= [UIColor whiteColor];
self.myTableView
=[[UITableViewalloc]initWithFrame:self.view.boundsstyle:UITableViewStyleGrouped];
[self.myTableView setDataSource:self];
[self.myTableView
setDelegate:self];
self.myTableView.autoresizingMask
= UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
[self.view
addSubview:self.myTableView];
}
//当点击键盘Return按钮时,将触发该方法
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];//放弃第一响应者。
return YES;
}
#pragma mark- UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableViewnumberOfRowsInSection:(NSInteger)section{
return 100;
}
-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath
*)indexPath{
UITableViewCell *result = nil;
static NSString *CellIdentifier =
@"CellIdentifier";
result = [tableViewdequeueReusableCellWithIdentifier:CellIdentifier];
if (result == nil){
result =[[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:CellIdentifier];
result.selectionStyle
=UITableViewCellSelectionStyleNone;
}
result.textLabel.text = [NSString
stringWithFormat:
@"Cell %ld", (long)indexPath.row];
CGRect accessoryRect = CGRectMake(0.0f,
0.0f,150.0f,31.0f);
UITextField *accesssory = [[UITextField
alloc] initWithFrame:accessoryRect];
accesssory.borderStyle=UITextBorderStyleRoundedRect;
accesssory.contentVerticalAlignment
=UIControlContentVerticalAlignmentCenter;
accesssory.placeholder =
@"Enter Text";
accesssory.delegate =
self;
result.accessoryView = accesssory;
return result;
}
-(void)viewDidUnload{
[selfsetMyTableView:nil];
[superviewDidUnload];
}
-(void)viewWillAppear:(BOOL)paramAnimated{
[super
viewDidAppear:paramAnimated];
//在通知中心注册观察者,并指定观察者感兴趣的事件
//
键盘将要显示时
NSNotificationCenter
*center = [NSNotificationCenterdefaultCenter];
[center
addObserver:self
selector:@selector(handleKeyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
//
键盘将要隐藏时
[center
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
}
//关于观察者,什么时候添加?什么时候移除?
// 添加应该在页面载入后,一般是:viewDidLoad,viewWillAppear方法中。
//移除应该在viewWillDisappear方法中。因为,应该养成这么一个好习惯:当某个ViewController不在屏幕上显示时,应该及时将观察者移除。
-(void)viewWillDisappear:(BOOL)paramAnimated{
[super
viewDidDisappear:paramAnimated];
//移除观察者,当移除观察者时,观察者所注册的观察事件也会被移除。
//从通知中心移除某个通知观察者的所有通知项。换句话说:将观察者注册的所有通知项从通知中心移除。
//
当然,也可以使用removeObserver:name:object:方法,来单个移除。
[[NSNotificationCenterdefaultCenter]removeObserver:self];
}
//键盘出现时,调用该方法
-(void)handleKeyboardWillShow:(NSNotification *)paramNotification{
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
UIWindow
*window = [[[UIApplication sharedApplication] delegate] window];//获得window
//
得到window.frame和键盘frame的交集
CGRectintersectionOfKeyboardRectAndWindowRect =
CGRectIntersection(window.frame, keyboardEndRect);
CGFloat bottomInset =intersectionOfKeyboardRectAndWindowRect.size.height;
self.myTableView.contentInset =
UIEdgeInsetsMake(0.0f,0.0f,bottomInset,0.0f);
NSIndexPath *indexPathOfOwnerCell =nil;
//保证得到焦点的UITextField(文本框)也显示在屏幕上
NSInteger numberOfCells = [self.myTableView.dataSource
tableView:self.myTableView
numberOfRowsInSection:0];
//
循环,并且得到获得焦点的UITextField(文本框)所在的UITableViewCell中的NSIndexPath信息,并滚动TableView到相应的位置
for (NSInteger counter =
0;counter <numberOfCells;counter++){
NSIndexPath*indexPath = [NSIndexPathindexPathForRow:counterinSection:0];
UITableViewCell *cell = [self.myTableView
cellForRowAtIndexPath:indexPath];
UITextField*textField = (UITextField*)cell.accessoryView;
if([textField isKindOfClass:[UITextField
class]] == NO){
continue;
}
if([textField isFirstResponder]){
indexPathOfOwnerCell = indexPath;
break;
}
}
[UIViewcommitAnimations];
//
滚动TableView到相应的位置
if (indexPathOfOwnerCell != nil){
[self.myTableView
scrollToRowAtIndexPath:indexPathOfOwnerCell
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
}
//键盘将要消失时,执行该方法
-(void)handleKeyboardWillHide:(NSNotification *)paramNotification{
//
比较两个EdgeInsets是否相等
if(UIEdgeInsetsEqualToEdgeInsets(self.myTableView.contentInset,
UIEdgeInsetsZero)){
//
无需设置TableView的contentInset
return;
}
NSDictionary *userInfo = [paramNotificationuserInfo];
NSValue
*animationCurveObject =[userInfovalueForKey:UIKeyboardAnimationCurveUserInfoKey];
NSValue
*animationDurationObject =[userInfovalueForKey:UIKeyboardAnimationDurationUserInfoKey];
NSValue *keyboardEndRectObject =[userInfovalueForKey:UIKeyboardFrameEndUserInfoKey];
NSUInteger animationCurve = 0;
double animationDuration = 0.0f;
CGRect keyboardEndRect = CGRectMake(0,
0,0,
0);
[animationCurveObjectgetValue:&animationCurve];
[animationDurationObjectgetValue:&animationDuration];
[keyboardEndRectObjectgetValue:&keyboardEndRect];
[UIView
beginAnimations:@"changeTableViewContentInset"context:NULL];
[UIView
setAnimationDuration:animationDuration];
[UIView
setAnimationCurve:(UIViewAnimationCurve)animationCurve];
self.myTableView.contentInset
= UIEdgeInsetsZero;
[UIViewcommitAnimations];
}
#pragma mark - 旋转支持
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
// returnUIInterfaceOrientationIsLandscape(toInterfaceOrientation);
return YES;
}
-(BOOL)shouldAutorotate
{
return YES;
}
-(NSInteger)supportedInterfaceOrientations
{
// returnUIInterfaceOrientationMaskLandscape;
returnUIInterfaceOrientationMaskAll;
}
@end
希望对你有所帮助!
相关文章推荐
- Android的TextView与Html相结合的具体方法
- android textview 显示html方法解析
- Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)
- Android实现TextView中文字链接的4种方式介绍及代码
- android TextView属性的详细介绍 分享
- android TextView加下划线的方法
- android TextView多行文本(超过3行)使用ellipsize属性无效问题的解决方法
- android显示TextView文字的倒影效果实现代码
- Android控件之TextView的分析探究
- TextView显示系统时间(时钟功能带秒针变化
- android TextView不用ScrollViewe也可以滚动的方法
- android开发教程之textview内容超出屏幕宽度显示省略号
- android Textview文字监控(Textview使用方法)
- 解析在Android中为TextView增加自定义HTML标签的实现方法
- Android用户界面开发之:TextView的使用实例
- 深入理解TextView实现Rich Text--在同一个TextView设置不同字体风格
- 关于TextView的setText()与Integer之间一个易犯的小错误 3ff8
- TextView的日常使用技巧
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- 规范之力:正确使用UIViewController(1)