iOS开发中防止键盘挡住UITextField解决方案

来源:互联网 发布:java判断题 编辑:程序博客网 时间:2024/05/20 17:26

转载自 http://blog.csdn.net/springsky_/article/details/7941858


最近转入ios开发,发现ios的UITextField如果在屏幕的最底部的时候,键盘不能自动的调整界面的布局,需要手动的调整位置才可以,所以自己研究和拿着笔话,想写一个通用的方法来实现每一个界面自动适配键盘的位置,这样的话,不用每一个界面去操作界面的位置了,具体的解决方案如下:


1. 先创建一个UIViewController  这个UIViewController作为父类,让以后的每一个界面继承这个界面,在这个界面里面实现一个委托,代码如下:


[plain] view plaincopy
  1. @interface BaseViewController : UIViewController <UITextFieldDelegate>  

2.在这个BaseViewCOntroller.m文件中,现实UITextFieldDelegate中的两个方法,textFieldDidBeginEditing(开始编辑UITextField和 textFieldDidEndEditing(结束编辑UITextField),大家都知道,iphone的键盘都是固定的,都是系统自带的,没有第三方的输入法的,所以键盘的高度是固定的216,我们只要在开始编辑的时候,计算一下当前的UITextField的所在高度相对底部是否有216(就是UITextField的底部边缘相对屏幕的底部是否有216个长度),如果不够216,就需要把整体的view上移达到216高度即可;当我们结束编辑的时候,把之前增加的高度相反操作即可,代码如下:

//设置调整界面的动画效果//设置调整界面的动画效果

[plain] view plaincopy
  1. int prewTag ;  //编辑上一个UITextField的TAG,需要在XIB文件中定义或者程序中添加,不能让两个控件的TAG相同  
  2. float prewMoveY; //编辑的时候移动的高度  
  3.   
  4. // 下面两个方法是为了防止TextFiled让键盘挡住的方法  
  5. /**  
  6.  开始编辑UITextField的方法  
  7.  */  
  8. -(void) textFieldDidBeginEditing:(UITextField *)textField  
  9. {  
  10.     CGRect textFrame =  textField.frame;  
  11.     float textY = textFrame.origin.y+textFrame.size.height;  
  12.     float bottomY = self.view.frame.size.height-textY;  
  13.     if(bottomY>=216)  //判断当前的高度是否已经有216,如果超过了就不需要再移动主界面的View高度  
  14.     {  
  15.         prewTag = -1;  
  16.         return;  
  17.     }  
  18.     prewTag = textField.tag;  
  19.     float moveY = 216-bottomY;    
  20.     prewMoveY = moveY;  
  21.       
  22.     NSTimeInterval animationDuration = 0.30f;  
  23.     CGRect frame = self.view.frame;  
  24.     frame.origin.y -=moveY;//view的Y轴上移  
  25.     frame.size.height +=moveY; //View的高度增加  
  26.     self.view.frame = frame;  
  27.     [UIView beginAnimations:@"ResizeView" context:nil];  
  28.     [UIView setAnimationDuration:animationDuration];  
  29.     self.view.frame = frame;  
  30.     [UIView commitAnimations];//设置调整界面的动画效果  
  31. }  
  32.   
  33. /**  
  34.  结束编辑UITextField的方法,让原来的界面还原高度  
  35.  */  
  36. -(void) textFieldDidEndEditing:(UITextField *)textField  
  37. {  
  38.     if(prewTag == -1) //当编辑的View不是需要移动的View  
  39.     {  
  40.         return;  
  41.     }  
  42.     float moveY ;  
  43.     NSTimeInterval animationDuration = 0.30f;  
  44.     CGRect frame = self.view.frame;  
  45.     if(prewTag == textField.tag) //当结束编辑的View的TAG是上次的就移动  
  46.     {   //还原界面  
  47.         moveY =  prewMoveY;  
  48.         frame.origin.y +=moveY;  
  49.         frame.size. height -=moveY;  
  50.         self.view.frame = frame;  
  51.     }  
  52.     //self.view移回原位置  
  53.     [UIView beginAnimations:@"ResizeView" context:nil];  
  54.     [UIView setAnimationDuration:animationDuration];  
  55.     self.view.frame = frame;  
  56.     [UIView commitAnimations];  
  57.     [textField resignFirstResponder];   
  58.   
  59.   
  60. }  

3.在上面的代码中,我们已经增加了委托对UITextField的编辑监听,下面我们就要让我们的子类UIViewController去监听委托

代码:

[plain] view plaincopy
  1. IDNameField.delegate = self;  
IDNameField是我继承BaseViewController的子类UIViewController中的一个UITextField,只要实现了上面的操作,我们的UITextField就可以在每一个界面实现自动适配调整界面,达到防止键盘挡住UITextField的效果了
0 0
原创粉丝点击