当前位置 > 主页 > 万和大讲堂 >


南京iOS开发应用培训中防止键盘挡住UITextField解决方案

2015-06-30 15:38

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

 

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

 

  [plain]

 

  @interface BaseViewController : UIViewController

 

  @interface BaseViewController : UIViewController

 

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

 

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

 

  [plain]

 

  int prewTag ; //编辑上一个UITextField的TAG,需要在XIB文件中定义或者程序中添加,不能让两个控件的TAG相同

 

  float prewMoveY; //编辑的时候移动的高度

 

  // 下面两个方法是为了防止TextFiled让键盘挡住的方法

 

  /**

 

  开始编辑UITextField的方法

 

  */

 

  -(void) textFieldDidBeginEditing:(UITextField *)textField

 

  {

 

  CGRect textFrame = textField.frame;

 

  float textY = textFrame.origin.y+textFrame.size.height;

 

  float bottomY = self.view.frame.size.height-textY;

 

  if(bottomY>=216) //判断当前的高度是否已经有216,如果超过了就不需要再移动主界面的View高度

 

  { 南京iOS开发应用培训

 

  prewTag = -1;

 

  return;

 

  }

 

  prewTag = textField.tag;

 

  float moveY = 216-bottomY;

 

  prewMoveY = moveY;

 

  NSTimeInterval animationDuration = 0.30f;

 

  CGRect frame = self.view.frame;

 

  frame.origin.y -=moveY;//view的Y轴上移

 

  frame.size.height +=moveY; //View的高度增加

 

  self.view.frame = frame;

 

  [UIView beginAnimations:@"ResizeView" context:nil];

 

  [UIView setAnimationDuration:animationDuration];

 

  self.view.frame = frame;

 

  [UIView commitAnimations];//设置调整界面的动画效果

 

  }

 

  /**

 

  结束编辑UITextField的方法,让原来的界面还原高度

 

  */

 

  -(void) textFieldDidEndEditing:(UITextField *)textField

 

  {

 

  if(prewTag == -1) //当编辑的View不是需要移动的View

 

  {

 

  return;

 

  }

 

  float moveY ;

 

  NSTimeInterval animationDuration = 0.30f;

 

  CGRect frame = self.view.frame;

 

  if(prewTag == textField.tag) //当结束编辑的View的TAG是上次的就移动

 

  { //还原界面

 

  moveY = prewMoveY;

 

  frame.origin.y +=moveY;

 

  frame.size. height -=moveY;

 

  self.view.frame = frame;

 

  }南京iOS开发应用培训

 

  //self.view移回原位置

 

  [UIView beginAnimations:@"ResizeView" context:nil];

 

  [UIView setAnimationDuration:animationDuration];

 

  self.view.frame = frame;

 

  [UIView commitAnimations];

 

  [textField resignFirstResponder];

 

  }

 

  int prewTag ; //编辑上一个UITextField的TAG,需要在XIB文件中定义或者程序中添加,不能让两个控件的TAG相同

 

  float prewMoveY; //编辑的时候移动的高度

 

  // 下面两个方法是为了防止TextFiled让键盘挡住的方法

 

  /**

 

  开始编辑UITextField的方法

 

  */

 

  -(void) textFieldDidBeginEditing:(UITextField *)textField

 

  { 南京iOS开发应用培训

 

  CGRect textFrame = textField.frame;

 

  float textY = textFrame.origin.y+textFrame.size.height;

 

  float bottomY = self.view.frame.size.height-textY;

 

  if(bottomY>=216) //判断当前的高度是否已经有216,如果超过了就不需要再移动主界面的View高度

 

  {

 

  prewTag = -1;

 

  return;

 

  }

 

  prewTag = textField.tag;

 

  float moveY = 216-bottomY;

 

  prewMoveY = moveY;

 

  NSTimeInterval animationDuration = 0.30f;

 

  CGRect frame = self.view.frame;

 

  frame.origin.y -=moveY;//view的Y轴上移

 

  frame.size.height +=moveY; //View的高度增加

 

  self.view.frame = frame;

 

  [UIView beginAnimations:@"ResizeView" context:nil];

 

  [UIView setAnimationDuration:animationDuration];

 

  self.view.frame = frame;

 

  [UIView commitAnimations];//设置调整界面的动画效果

 

  }南京iOS开发应用培训

 

  /**

 

  结束编辑UITextField的方法,让原来的界面还原高度

 

  */

 

  -(void) textFieldDidEndEditing:(UITextField *)textField

 

  {

 

  if(prewTag == -1) //当编辑的View不是需要移动的View

 

  {

 

  return;

 

  }

 

  float moveY ;

 

  NSTimeInterval animationDuration = 0.30f;

 

  CGRect frame = self.view.frame;

 

  if(prewTag == textField.tag) //当结束编辑的View的TAG是上次的就移动

 

  { //还原界面

 

  moveY = prewMoveY;

 

  frame.origin.y +=moveY;

 

  frame.size. height -=moveY;

 

  self.view.frame = frame;

 

  }

 

  //self.view移回原位置

 

  [UIView beginAnimations:@"ResizeView" context:nil];

 

  [UIView setAnimationDuration:animationDuration];

 

  self.view.frame = frame;

 

  [UIView commitAnimations];

 

  [textField resignFirstResponder];

 

  }

 

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

 

  代码:

 

  [plain]

 

  IDNameField.delegate = self;

 

  IDNameField.delegate = self;IDNameField是我继承BaseViewController的子类UIViewController中的一个UITextField,只要实现了上面的操作,我们的UITextField就可以在每一个界面实现自动适配调整界面,达到防止键盘挡住UITextField的效果了。


最近开班 more>
  • Python基础班
  • Java全栈开发
  • 前端基础班
  • 软件测试
  • 云原生精英班
  • 云网预科班
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 随时开课
  • 12月26日
  • 随时开课
  • 12月4日
  • 12月16日
  • 12月9日
  • 12月21日
  • 1月6日
  • 12月30日
  • 12月16日
  • 12月21日
  • 12月7日
  • 12月7日
  • ——
  • 随时开课
  • 12月16日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入