【iOS開發-16】UITextField協議的用法,鍵盤的隱藏,以及視圖隨著鍵盤的出現隱藏而上下調整位置
來源:程序員人生 發布時間:2014-10-06 08:00:01 閱讀次數:3441次
(1)有很多對于文本框的編輯和結束編輯的設置需要用到文本框協議,即UITextFieldDelegate:先在AppDelegate.h中加入<UITextFieldDelegate>協議,然后就可以在ViewController.m中使用。比如我們本例中對t1這個文本框對象設置了代理,代理self,即本視圖控制器類,所以在本類中使用的方法都會影響t1,即可以設置t1。(最后幾句為猜測,后續繼續學習看是否如此)。
(2)當然真正的幾個函數其實沒甚么意思,無非就是是否允許編輯和結束編輯,如果真的“編輯了”和“結束編輯了”可以給它設置一個操作等等,以及是否允許清除。
(3)其中最重要的可能就是在textFieldShouldReturn中設置按Return后隱藏鍵盤,這個方法是[t1 resignFirstResponder];這個很實用。
(4)緊接著,我們實現了一個隨著鍵盤出現和隱藏,如果有被其遮蓋的視圖,我們也隨之調整這些被遮蓋的視圖位置(如本例的按鈕)。這里面用到一個通知,當然我們也順便熟悉了一下UIView里面的animateWithDuration動畫。
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
{
UITextField *t1;
UIButton *btn1;
}
- (void)viewDidLoad {
//設置兩個文本框
t1=[[UITextField alloc]init];
UITextField *t2=[[UITextField alloc]init];
t1.frame=CGRectMake(10, 30, 300, 30);
t2.frame=CGRectMake(10, 80, 300, 30);
t1.borderStyle=UITextBorderStyleRoundedRect;
t2.borderStyle=UITextBorderStyleRoundedRect;
t1.clearButtonMode=UITextFieldViewModeUnlessEditing;
//把t1的代理設置為self,即我們現在正在書寫正在用的這個類(文件)
t1.delegate=self;
//我們后增加一個UIControl對象,覆蓋整個iPhone6模擬屏幕,設置大一點沒關系
UIControl *control1=[[UIControl alloc]init];
control1.frame=CGRectMake(0, 0, 500, 800);
[self.view addSubview:control1];
control1.backgroundColor=[UIColor redColor];
//我們發現雖然control1是后加載的,但是貌似沒有遮擋住之前加載的文本框
//而且就算我把control1弄到最上面,仍然不遮擋(在低版本中是遮擋的需要調整順序),奇怪,智能了嗎這是?
[self.view bringSubviewToFront:control1];
[control1 addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:t1];
[self.view addSubview:t2];
//創建一個按鈕,隨著鍵盤上下而上下,使得不被鍵盤遮擋
//btn1需要是全局變量,因為在下面需要調用它來改變它的位置,上下移動
btn1=[UIButton buttonWithType:UIButtonTypeRoundedRect];
btn1.frame=CGRectMake(10, 500, 300, 30);
btn1.backgroundColor=[UIColor whiteColor];
[btn1 setTitle:@"點我啊" forState:UIControlStateNormal];
[self.view addSubview:btn1];
//需要設置一個通知,獲取系統的鍵盤顯示和隱藏消息,然后做出位置改變的操作
//這里的UIKeyboardWillShowNotification時系統自帶的
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardShow) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardHide) name:UIKeyboardWillHideNotification object:nil];
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
//點擊Control1時(相對于用戶就是點擊其他地方),鍵盤隱藏
-(void)hideKeyboard{
[t1 resignFirstResponder];
}
//鍵盤顯示的時候,按鈕向上跑,不會被遮蓋
-(void)keyboardShow{
btn1.frame=CGRectMake(10, 180, 300, 30);
}
//鍵盤隱藏是,按鈕向下回到原先的位置
//這里面嘗試一個動畫,和沒有動畫,直接確定位置是一個效果,差不多
-(void)keyboardHide{
[UIView animateWithDuration:0.25 animations:^{
btn1.frame=CGRectMake(10, 500, 300, 30);
}completion:^(BOOL finished){
}];
}
//設置文本框是否可以編輯,NO的話就不可編輯,默認是YES
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return YES;
}
//已經編輯時的方法
- (void)textFieldDidBeginEditing:(UITextField *)textField{
NSLog(@"已經編輯中");
}
//是否可以結束編輯,如果是NO的話,那么你指向其他地方,這個光標還在這里跳動編輯,默認是YES
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return YES;
}
//編輯結束時的方法
- (void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"編輯結束了");
}
//是否可清除。如果是NO的話,我們結束編輯時雖然有叉叉X,但是點擊無法清除
//但我們可以手動清除,即雖然設置為NO,但同時設置它的文本為空,如下
//區別在于,后者,我們編輯其他文本框時點擊它清除,這個時候光標還是原來文本框中,不會跳到這個清除的文本框里
- (BOOL)textFieldShouldClear:(UITextField *)textField{
t1.text=@"";
return NO;
}
//是否可點擊return鍵,NO設置貌似暫時無法看到效果。
//我們用得比較多得功能是按return后隱藏鍵盤
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
//取消第一響應者,就是結束輸入病隱藏鍵盤
[t1 resignFirstResponder];
return YES;
}
@end
截個圖:

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈