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

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

希望对你有所帮助!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息