iOS开发 键盘添加工具条(toolbar)
原文地址 http://gaohaijun.blog.163.com/blog/static/17669827120119233349519/
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的实例对象调用显示键盘方法
}
三、总结
上述的基本原理就是在键盘的上方,加一个透明状的工具条;当然不需要专门定义类,也可以的,可以直接在
需要调用键盘的地方加入工具条,让你的工具条随着键盘的出现而出现,消失而消失!
大道至简,有更好的方法,希望一起讨论交流,谢谢!
相关推荐
在实际的iOS开发中,自定义下拉菜单是一个常见的需求,因此开发者需要对各个控件的属性和事件处理有充分的了解。通过上述步骤,我们可以实现一个功能完备的下拉菜单,虽然它需要多个组件协同工作,但最终的用户体验...
1. iOS中的工具栏(Toolbar)的使用和自定义。 2. 导航栏(Navigation Bar)的结构及`NavigationItem`的配置。 3. `UISegmentedControl`的创建与应用,特别是在导航栏中的使用。 4. `UITableView`的基本操作和自定义...
在iOS应用开发中,`Toolbar`和`NavigationController`是两个关键组件,它们极大地提升了用户界面的可操作性和用户体验。`Toolbar`通常被用作底部的工具栏,展示一系列按钮或者快捷方式,而`NavigationController`则...
在Android应用开发中,模仿iOS音乐App的自定义导航栏功能是一项常见的需求,这能为用户提供更加美观且一致的交互体验。iOS音乐App的导航栏以其简洁、清晰的设计著称,通常包括标题、左侧返回按钮以及一些特色的操作...
在Android开发中,`Toolbar`已经逐渐取代了传统的`ActionBar`,成为了自定义化程度更高的导航栏组件。它允许开发者自由地设计布局,提供更丰富的交互体验。本实例重点讲解如何自定义`Toolbar`布局,并结合`...
例如,Android 上的 Toolbar 可以包含更多的自定义视图,如搜索栏,而在 iOS 上,Navigation Bar 的布局更加受限。如果需要更复杂的定制,可以使用 PlatformSpecific 特性或 Effects 来实现。 5. 示例项目 "Toolbar...
`ios-KeyboardToolBar.zip`是一个包含源代码的压缩包,其核心功能是创建一个自定义的工具栏,该工具栏会随着键盘的出现和消失而动态调整位置。这个工具栏可以包含各种按钮,如“Done”(完成)、“Cancel”(取消)...
不过,iOS对自定义键盘的权限控制较严,需要在Info.plist文件中设置相应的键值对,并且需要用户在设置中明确允许才能使用。 3. **Keyboard Extension**:自定义键盘的实现需要创建一个新的目标类型——Keyboard ...
3. Action Bar(或ToolBar):iOS中的导航栏与Android的Action Bar/ToolBar有明显的视觉差异。在Android中,我们可以使用`SherlockActionBar`库(如`library_actionbarsherlock`)来实现与iOS类似的导航栏,它提供了...
在移动应用开发中,如Android,我们可以通过`android.widget.Toolbar`类来创建自定义工具栏。每个图标通常是一个`MenuItem`,通过`menu.xml`文件定义,并在`onOptionsItemSelected(MenuItem item)`回调中处理点击...
在Android开发中,Collapsing Toolbar是Android设计支持库提供的一种功能强大的布局组件,它允许ToolBar在用户滚动视图时动态地改变其高度和可见性,从而实现类似iOS中的Parallax效果,为应用添加丰富的视觉体验。...
默认情况下,Toolbar会显示一个返回按钮,你可以自定义它的图标和行为: ```csharp SupportActionBar.SetHomeAsUpIndicator(Resource.Drawable.ic_back); SupportActionBar.SetDisplayHomeAsUpEnabled(true); `...
本示例将探讨如何创建一个简单的iOS日期选择器,并实现一个自定义的toolbar与之配合,以提供更好的用户体验。以下将详细介绍这个过程,以及相关的知识点。 首先,我们需要了解iOS中的日期选择器类型。在iOS中,日期...
通过本文的讲解,你应该对如何在`UINavigationController`中使用ToolBar有了更清晰的认识,同时也了解了如何自定义导航栏和使用相关工具进行调试。在实际项目中,你可以结合这些知识,创造出更符合用户需求的交互...
在iOS应用开发中,底部工具条(BottomToolBar)通常用于为用户提供快捷操作入口,它类似于系统的TabBar,但更加灵活,可以根据应用场景动态显示或隐藏。本文将深入探讨如何模仿系统底部弹出菜单工具框,实现向上推出...
总结来说,这个项目为Android开发者提供了一个可以在Eclipse环境中使用的仿iOS选择器组件,包括一个核心的PickerScrollView自定义视图和appcompat_v7兼容性库。通过这个组件,开发者可以轻松地在Android应用中实现与...
尽管Android和iOS有不同的设计原则,但通过适当的自定义,可以在保持原生体验的同时,满足用户对视觉一致性的需求。对于那些希望在Android应用中融入iOS元素的开发者来说,这是一个很好的实践案例。
在iOS应用开发中,自定义工具栏(Toolbar)是一个常见的需求,它可以帮助我们提供更加个性化和功能丰富的用户体验。工具栏通常用于放置按钮、分割线等元素,以执行特定的操作或切换视图。本教程将深入探讨如何使用...
本文将详细讲解如何在iOS应用中使用Toolbar来实现视图切换的方法,同时介绍UIToolbar的相关属性和方法。 首先,UIToolbar本身是一个视图对象,它可以包含多个UIBarButtonItem实例,这些按钮可以是系统预设样式,也...
总结起来,这个例子通过结合`ToolBar`、`Fragment`、`CoordinatorLayout`、`NestedScrollView`以及自定义滚动监听和动画,成功实现了类似iOS的导航栏滚动效果。开发者可以根据具体需求调整滚动速度和动画细节,以...