你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發中防止鍵盤擋住UITextField解決方案

iOS開發中防止鍵盤擋住UITextField解決方案

編輯:IOS開發綜合

  最近轉入ios開發,發現ios的UITextField如果在屏幕的最底部的時候,鍵盤不能自動的調整界面的布局,需要手動的調整位置才可以,所以自己研究和拿著筆話,想寫一個通用的方法來實現每一個界面自動適配鍵盤的位置,這樣的話,不用每一個界面去操作界面的位置了,具體的解決方案如下:

 


1. 先創建一個UIViewController  這個UIViewController作為父類,讓以後的每一個界面繼承這個界面,在這個界面裡面實現一個委托,代碼如下:

 

 

[plain]
@interface BaseViewController : UIViewController <UITextFieldDelegate> 

@interface BaseViewController : UIViewController <UITextFieldDelegate>
2.在這個BaseViewCOntroller.m文件中,現實UITextFieldDelegate中的兩個方法,textFieldDidBeginEditing(開始編輯UITextField和 textFieldDidEndEditing(結束編輯UITextField),大家都知道,iphone的鍵盤都是固定的,都是系統自帶的,沒有第三方的輸入法的,所以鍵盤的高度是固定的216,我們只要在開始編輯的時候,計算一下當前的UITextField的所在高度相對底部是否有216(就是UITextField的底部邊緣相對屏幕的底部是否有216個長度),如果不夠216,就需要把整體的view上移達到216高度即可;當我們結束編輯的時候,把之前增加的高度相反操作即可,代碼如下:

//設置調整界面的動畫效果//設置調整界面的動畫效果

[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高度 
    { 
        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; 
    } 
    //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
{
    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];//設置調整界面的動畫效果
}

/**
 結束編輯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的效果了,以上出自Spring sky ,歡迎轉載,請尊重作者的經驗!如有疑問,請聯系:

QQ:840950105

Email:[email protected]

 

 

 

 

 


 

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved