您的位置:首页 > 产品设计 > UI/UE

转 IOS开发UI篇之──键盘添加工具条

2011-08-16 17:16 267 查看
IOS开发中,iphone/ipad/itouch采用的触摸设计,本身没有硬件键盘,一般都是点击输入框之后,弹出一个虚拟键盘出来,因此开发中,经常在完成编辑输入之后,要写程序代码来关闭软键盘的输出,非常繁琐,当然关闭软键盘的方式有很多。本文要分享的是一个键盘顶部工具条的类,通过这个工具条,可以很方便的关闭键盘,而且有上一项,下一项的输入框切换,非常方便,效果如下图所示:



一、KeyBoardTopBar类文件

1)KeyBoardTopBar.h头文件

#import <Foundation/Foundation.h>

@interface KeyBoardTopBar : NSObject {

UIToolbar *view; //工具条

NSArray *textFields; //输入框数组

BOOL allowShowPreAndNext; //是否显示上一项、下一项

BOOL isInNavigationController; //是否在导航视图中

UIBarButtonItem *prevButtonItem; //上一项按钮

UIBarButtonItem *nextButtonItem; //下一项按钮

UIBarButtonItem *hiddenButtonItem; //隐藏按钮

UIBarButtonItem *spaceButtonItem; //空白按钮

UITextField *currentTextField; //当前输入框

}

@property(nonatomic,retain) UIToolbar *view;

-(id)init;

-(void)setAllowShowPreAndNext:(BOOL)isShow;

-(void)setIsInNavigationController:(BOOL)isbool;

-(void)setTextFieldsArray:(NSArray *)array;

-(void)showPrevious;

-(void)showNext;

-(void)showBar:(UITextField *)textField;

-(void)HiddenKeyBoard;

@end

2)KeyBoardTopBar.m实现文件

#import "KeyBoardTopBar.h"

@implementation KeyBoardTopBar

@synthesize view;

//初始化控件和变量

-(id)init{

if((self = [super init])) {

prevButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"上一项" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowPrevious)];

nextButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"下一项" style:UIBarButtonItemStyleBordered target:self action:@selector(ShowNext)];

hiddenButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"隐藏键盘" style:UIBarButtonItemStyleBordered target:self action:@selector(HiddenKeyBoard)];

spaceButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

view = [[UIToolbar alloc] initWithFrame:CGRectMake(0,480,320,44)];

view.barStyle = UIBarStyleBlackTranslucent;

view.items = [NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil];

allowShowPreAndNext = YES;

textFields = nil;

isInNavigationController = YES;

currentTextField = nil;

}

return self;

}

//设置是否在导航视图中

-(void)setIsInNavigationController:(BOOL)isbool{

isInNavigationController = isbool;

}

//显示上一项

-(void)showPrevious{

if (textFields==nil) {

return;

}

NSInteger num = -1;

for (NSInteger i=0; i<[textFields count]; i++) {

if ([textFields objectAtIndex:i]==currentTextField) {

num = i;

break;

}

}

if (num>0){

[[textFields objectAtIndex:num] resignFirstResponder];

[[textFields objectAtIndex:num-1 ] becomeFirstResponder];

[self showBar:[textFields objectAtIndex:num-1]];

}

}

//显示下一项

-(void)showNext{

if (textFields==nil) {

return;

}

NSInteger num = -1;

for (NSInteger i=0; i<[textFields count]; i++) {

if ([textFields objectAtIndex:i]==currentTextField) {

num = i;

break;

}

}

if (num<[textFields count]-1){

[[textFields objectAtIndex:num] resignFirstResponder];

[[textFields objectAtIndex:num+1] becomeFirstResponder];

[self showBar:[textFields objectAtIndex:num+1]];

}

}

//显示工具条

-(void)showBar:(UITextField *)textField{

currentTextField = textField;

if (allowShowPreAndNext) {

[view setItems:[NSArray arrayWithObjects:prevButtonItem,nextButtonItem,spaceButtonItem,hiddenButtonItem,nil]];

}

else {

[view setItems:[NSArray arrayWithObjects:spaceButtonItem,hiddenButtonItem,nil]];

}

if (textFields==nil) {

prevButtonItem.enabled = NO;

nextButtonItem.enabled = NO;

}

else {

NSInteger num = -1;

for (NSInteger i=0; i<[textFields count]; i++) {

if ([textFields objectAtIndex:i]==currentTextField) {

num = i;

break;

}

}

if (num>0) {

prevButtonItem.enabled = YES;

}

else {

prevButtonItem.enabled = NO;

}

if (num<[textFields count]-1) {

nextButtonItem.enabled = YES;

}

else {

nextButtonItem.enabled = NO;

}

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:0.3];

if (isInNavigationController) {

view.frame = CGRectMake(0, 201-40, 320, 44);

}

else {

view.frame = CGRectMake(0, 201, 320, 44);

}

[UIView commitAnimations];

}

//设置输入框数组

-(void)setTextFieldsArray:(NSArray *)array{

textFields = array;

}

//设置是否显示上一项和下一项按钮

-(void)setAllowShowPreAndNext:(BOOL)isShow{

allowShowPreAndNext = isShow;

}

//隐藏键盘和工具条

-(void)HiddenKeyBoard{

if (currentTextField!=nil) {

[currentTextField resignFirstResponder];

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:0.3];

view.frame = CGRectMake(0, 480, 320, 44);

[UIView commitAnimations];

}

- (void)dealloc {

[view release];

[textFields release];

[prevButtonItem release];

[nextButtonItem release];

[hiddenButtonItem release];

[currentTextField release];

[spaceButtonItem release];

[super dealloc];

}

@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的实例对象调用显示键盘方法

}

三、总结

上述的基本原理就是在键盘的上方,加一个透明状的工具条;当然不需要专门定义类,也可以的,可以直接在

需要调用键盘的地方加入工具条,让你的工具条随着键盘的出现而出现,消失而消失!

大道至简,有更好的方法,希望一起讨论交流,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: