For investors
股價(jià):
5.36 美元 %For investors
股價(jià):
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
最近轉(zhuǎn)入ios開發(fā),發(fā)現(xiàn)ios的UITextField如果在屏幕的最底部的時(shí)候,鍵盤不能自動(dòng)的調(diào)整界面的布局,需要手動(dòng)的調(diào)整位置才可以,所以自己研究和拿著筆話,想寫一個(gè)通用的方法來實(shí)現(xiàn)每一個(gè)界面自動(dòng)適配鍵盤的位置,這樣的話,不用每一個(gè)界面去操作界面的位置了,具體的解決方案如下:
1. 先創(chuàng)建一個(gè)UIViewController 這個(gè)UIViewController作為父類,讓以后的每一個(gè)界面繼承這個(gè)界面,在這個(gè)界面里面實(shí)現(xiàn)一個(gè)委托,代碼如下:
[plain]
@interface BaseViewController : UIViewController
@interface BaseViewController : UIViewController
2.在這個(gè)BaseViewCOntroller.m文件中,現(xiàn)實(shí)UITextFieldDelegate中的兩個(gè)方法,textFieldDidBeginEditing(開始編輯UITextField和 textFieldDidEndEditing(結(jié)束編輯UITextField),大家都知道,iphone的鍵盤都是固定的,都是系統(tǒng)自帶的,沒有第三方的輸入法的,所以鍵盤的高度是固定的216,我們只要在開始編輯的時(shí)候,計(jì)算一下當(dāng)前的UITextField的所在高度相對(duì)底部是否有216(就是UITextField的底部邊緣相對(duì)屏幕的底部是否有216個(gè)長度),如果不夠216,就需要把整體的view上移達(dá)到216高度即可;當(dāng)我們結(jié)束編輯的時(shí)候,把之前增加的高度相反操作即可,代碼如下:
//設(shè)置調(diào)整界面的動(dòng)畫效果//設(shè)置調(diào)整界面的動(dòng)畫效果
[plain]
int prewTag ; //編輯上一個(gè)UITextField的TAG,需要在XIB文件中定義或者程序中添加,不能讓兩個(gè)控件的TAG相同
float prewMoveY; //編輯的時(shí)候移動(dòng)的高度
// 下面兩個(gè)方法是為了防止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) //判斷當(dāng)前的高度是否已經(jīng)有216,如果超過了就不需要再移動(dòng)主界面的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];//設(shè)置調(diào)整界面的動(dòng)畫效果
}
/**
結(jié)束編輯UITextField的方法,讓原來的界面還原高度
*/
-(void) textFieldDidEndEditing:(UITextField *)textField
{
if(prewTag == -1) //當(dāng)編輯的View不是需要移動(dòng)的View
{
return;
}
float moveY ;
NSTimeInterval animationDuration = 0.30f;
CGRect frame = self.view.frame;
if(prewTag == textField.tag) //當(dāng)結(jié)束編輯的View的TAG是上次的就移動(dòng)
{ //還原界面
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 ; //編輯上一個(gè)UITextField的TAG,需要在XIB文件中定義或者程序中添加,不能讓兩個(gè)控件的TAG相同
float prewMoveY; //編輯的時(shí)候移動(dòng)的高度
// 下面兩個(gè)方法是為了防止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) //判斷當(dāng)前的高度是否已經(jīng)有216,如果超過了就不需要再移動(dòng)主界面的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];//設(shè)置調(diào)整界面的動(dòng)畫效果
}
/**
結(jié)束編輯UITextField的方法,讓原來的界面還原高度
*/
-(void) textFieldDidEndEditing:(UITextField *)textField
{
if(prewTag == -1) //當(dāng)編輯的View不是需要移動(dòng)的View
{
return;
}
float moveY ;
NSTimeInterval animationDuration = 0.30f;
CGRect frame = self.view.frame;
if(prewTag == textField.tag) //當(dāng)結(jié)束編輯的View的TAG是上次的就移動(dòng)
{ //還原界面
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.在上面的代碼中,我們已經(jīng)增加了委托對(duì)UITextField的編輯監(jiān)聽,下面我們就要讓我們的子類UIViewController去監(jiān)聽委托
代碼:
[plain]
IDNameField.delegate = self;
IDNameField.delegate = self;IDNameField是我繼承BaseViewController的子類UIViewController中的一個(gè)UITextField,只要實(shí)現(xiàn)了上面的操作,我們的UITextField就可以在每一個(gè)界面實(shí)現(xiàn)自動(dòng)適配調(diào)整界面,達(dá)到防止鍵盤擋住UITextField的效果了。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)?jiān)?0日內(nèi)與聯(lián)系我們,我們會(huì)予以更改或刪除相關(guān)文章,以保證您的權(quán)益!