原文地址 http://gaohaijun.blog.163.com/blog/static/17669827120119233349519/
IOS 開發中,iphone/ipad/itouch采用的觸摸設計,本身沒有硬件鍵盤,一般都是點擊輸入框之后,彈出一個虛擬鍵盤出來,因此開發中,經常在完 成編輯輸入之后,要寫程序代碼來關閉軟鍵盤的輸出,非常繁瑣,當然關閉軟鍵盤的方式有很多。本文要分享的是一個鍵盤頂部工具條的類,通過這個工具條,可以 很方便的關閉鍵盤,而且有上一項,下一項的輸入框切換,非常方便,效果如下圖所示:
一、KeyBoardTopBar類文件
1)KeyBoardTopBar.h頭文件
1 #import <Foundation/Foundation.h> 2 3 4 @interface KeyBoardTopBar : NSObject { 5 6 UIToolbar *view; //工具條 7 8 NSArray *textFields; //輸入框數組 9 10 BOOL allowShowPreAndNext; //是否顯示上一項、下一項 11 12 BOOL isInNavigationController; //是否在導航視圖中 13 14 UIBarButtonItem *prevButtonItem; //上一項按鈕 15 16 UIBarButtonItem *nextButtonItem; //下一項按鈕 17 18 UIBarButtonItem *hiddenButtonItem; //隱藏按鈕 19 20 UIBarButtonItem *spaceButtonItem; //空白按鈕 21 22 UITextField *currentTextField; //當前輸入框 23 24 } 25 26 @property(nonatomic,retain) UIToolbar *view; 27 28 29 -(id)init; 30 31 -(void)setAllowShowPreAndNext:(BOOL)isShow; 32 33 -(void)setIsInNavigationController:(BOOL)isbool; 34 35 -(void)setTextFieldsArray:(NSArray *)array; 36 37 -(void)showPrevious; 38 39 -(void)showNext; 40 41 -(void)showBar:(UITextField *)textField; 42 43 -(void)HiddenKeyBoard; 44 45 @end
2)KeyBoardTopBar.m實現文件
1 #import "KeyBoardTopBar.h" 2 3 4 @implementation KeyBoardTopBar 5 6 @synthesize view; 7 8 9 //初始化控件和變量 10 11 -(id)init{ 12 13 if((self = [super init])) { 14 15 prevButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"上一項" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowPrevious)]; 16 17 nextButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"下一項" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowNext)]; 18 19 hiddenButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"隱藏鍵盤" style:UIBarButtonItemStyleBordered target:self action:@selector(HiddenKeyBoard)]; 20 21 spaceButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 22 23 view = [[UIToolbar alloc] initWithFrame:CGRectMake(0,480,320,44)]; 24 25 view.barStyle = UIBarStyleBlackTranslucent; 26 27 view.items = [NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil]; 28 29 allowShowPreAndNext = YES; 30 31 textFields = nil; 32 33 isInNavigationController = YES; 34 35 currentTextField = nil; 36 37 } 38 39 return self; 40 41 } 42 43 //設置是否在導航視圖中 44 45 -(void)setIsInNavigationController:(BOOL)isbool{ 46 47 isInNavigationController = isbool; 48 49 } 50 51 //顯示上一項 52 53 -(void)showPrevious{ 54 55 if (textFields==nil) { 56 57 return; 58 59 } 60 61 NSInteger num = -1; 62 63 for (NSInteger i=0; i<[textFields count]; i++) { 64 65 if ([textFields objectAtIndex:i]==currentTextField) { 66 67 num = i; 68 69 break; 70 71 } 72 73 } 74 75 if (num>0){ 76 77 [[textFields objectAtIndex:num] resignFirstResponder]; 78 79 [[textFields objectAtIndex:num-1 ] becomeFirstResponder]; 80 81 [self showBar:[textFields objectAtIndex:num-1]]; 82 83 } 84 85 } 86 87 //顯示下一項 88 89 -(void)showNext{ 90 91 if (textFields==nil) { 92 93 return; 94 95 } 96 97 NSInteger num = -1; 98 99 for (NSInteger i=0; i<[textFields count]; i++) { 100 101 if ([textFields objectAtIndex:i]==currentTextField) { 102 103 num = i; 104 105 break; 106 107 } 108 109 } 110 111 if (num<[textFields count]-1){ 112 113 [[textFields objectAtIndex:num] resignFirstResponder]; 114 115 [[textFields objectAtIndex:num+1] becomeFirstResponder]; 116 117 [self showBar:[textFields objectAtIndex:num+1]]; 118 119 } 120 121 } 122 123 //顯示工具條 124 125 -(void)showBar:(UITextField *)textField{ 126 127 currentTextField = textField; 128 129 if (allowShowPreAndNext) { 130 131 [view setItems:[NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil]]; 132 133 } 134 135 else { 136 137 [view setItems:[NSArray arrayWithObjects:spaceButtonItem,hiddenButtonItem,nil]]; 138 139 } 140 141 if (textFields==nil) { 142 143 prevButtonItem.enabled = NO; 144 145 nextButtonItem.enabled = NO; 146 147 } 148 149 else { 150 151 NSInteger num = -1; 152 153 for (NSInteger i=0; i<[textFields count]; i++) { 154 155 if ([textFields objectAtIndex:i]==currentTextField) { 156 157 num = i; 158 159 break; 160 161 } 162 163 } 164 165 if (num>0) { 166 167 prevButtonItem.enabled = YES; 168 169 } 170 171 else { 172 173 prevButtonItem.enabled = NO; 174 175 } 176 177 if (num<[textFields count]-1) { 178 179 nextButtonItem.enabled = YES; 180 181 } 182 183 else { 184 185 nextButtonItem.enabled = NO; 186 187 } 188 189 } 190 191 [UIView beginAnimations:nil context:nil]; 192 193 [UIView setAnimationDuration:0.3]; 194 195 if (isInNavigationController) { 196 197 view.frame = CGRectMake(0, 201-40, 320, 44); 198 199 } 200 201 else { 202 203 view.frame = CGRectMake(0, 201, 320, 44); 204 205 } 206 207 [UIView commitAnimations]; 208 209 } 210 211 //設置輸入框數組 212 213 -(void)setTextFieldsArray:(NSArray *)array{ 214 215 textFields = array; 216 217 } 218 219 //設置是否顯示上一項和下一項按鈕 220 221 -(void)setAllowShowPreAndNext:(BOOL)isShow{ 222 223 allowShowPreAndNext = isShow; 224 225 } 226 227 //隱藏鍵盤和工具條 228 229 -(void)HiddenKeyBoard{ 230 231 if (currentTextField!=nil) { 232 233 [currentTextField resignFirstResponder]; 234 235 } 236 237 [UIView beginAnimations:nil context:nil]; 238 239 [UIView setAnimationDuration:0.3]; 240 241 view.frame = CGRectMake(0, 480, 320, 44); 242 243 [UIView commitAnimations]; 244 245 } 246 247 - (void)dealloc { 248 249 [view release]; 250 251 [textFields release]; 252 253 [prevButtonItem release]; 254 255 [nextButtonItem release]; 256 257 [hiddenButtonItem release]; 258 259 [currentTextField release]; 260 261 [spaceButtonItem release]; 262 263 [super dealloc]; 264 265 } 266 267 @end
二、如何使用
1)在用到輸入的controller類.h頭文件中,首先引入導入KeyBoardTopBar:
#import "KeyBoardTopBar.h"
NSMutableArray *editFieldArray; //存放視圖中可編輯的控件
KeyBoardTopBar *keyboardbar;
2)在用到輸入的controller類.m實現文件中,首先初始化KeyBoardTopBar類的實例,如下:
keyboardbar = [[KeyBoardTopBar alloc]init];
[keyboardbar setAllowShowPreAndNext:YES];
[keyboardbar setIsInNavigationController:NO];
[keyboardbar setTextFieldsArray:editFieldArray];
[self.view addSubview:keyboardbar.view];
3)在用到輸入的controller類.m實現文件中,在此以UITextField為例說明,在它的回調方法中,實現如下:
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[keyboardbar showBar:textField];//KeyBoardTopBar的實例對象調用顯示鍵盤方法
}
三、總結
上述的基本原理就是在鍵盤的上方,加一個透明狀的工具條;當然不需要專門定義類,也可以的,可以直接在
需要調用鍵盤的地方加入工具條,讓你的工具條隨着鍵盤的出現而出現,消失而消失!
大道至簡,有更好的方法,希望一起討論交流,謝謝!