iOS_22自定义键盘工具栏

最后效果图:

Main.storyboard

KeyboardTool.xib

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

KeyboardTool.h

//  KeyboardTool.h
//  键盘处理
//  Created by beyond on 14-8-24.
//  Copyright (c) 2014年 com.beyond. All rights reserved.

#import <UIKit/UIKit.h>
@protocol KeyboardToolDelegate;

typedef enum {
    kKeyboardToolButtonTypeNext, // 下一个button
    kKeyboardToolButtonTypePrevious, // 上一个button
    kKeyboardToolButtonTypeDone // 完毕button
} KeyboardToolButtonType;

@interface KeyboardTool : UIToolbar

// 上一个button控件
@property (nonatomic, weak) IBOutlet UIBarButtonItem *previousBtn;

// 下一个button控件
@property (nonatomic, weak) IBOutlet UIBarButtonItem *nextBtn;

// 完毕button控件
@property (nonatomic, weak) IBOutlet UIBarButtonItem *doneBtn;

// 代理一般用weak,同一时候,避免与默认的继承的delegate冲突
@property (nonatomic, weak) id<KeyboardToolDelegate> toolDelegate;

// 类方法 返回一个实例对象
+ (id)keyboardTool;

// 监听工具条上 三个button的点击 事件
- (IBAction)previousBtnClicked;

- (IBAction)nextBtnClicked;

- (IBAction)doneBtnClicked;
@end

KeyboardTool.m

//  KeyboardTool.m
//  键盘处理
//  Created by beyond on 14-8-24.
//  Copyright (c) 2014年 com.beyond. All rights reserved.

#import "KeyboardTool.h"
#import "KeyboardToolDelegate.h"

@implementation KeyboardTool

// 类方法,从xib文件里初始化一个KeyboardTool
+ (id)keyboardTool {
    // owner能够传KeyboardTool这个类
    // 点击"下一个"button的时候。要调用owner的next方法

    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"keyboardTool" owner:nil options:nil];

    // 返回初始化完毕的KeyboardTool对象
    return array[0];
}
#pragma mark - 点击事件
// 点击了上一个button
- (void)previousBtnClicked {
    if ([_toolDelegate respondsToSelector:@selector(keyboardTool:buttonType:)]) {
        // 告诉代理,点击的是上一个button
        [_toolDelegate keyboardTool:self buttonType:kKeyboardToolButtonTypePrevious];
    }
}
// 点击了下一个button
- (void)nextBtnClicked {
    if ([_toolDelegate respondsToSelector:@selector(keyboardTool:buttonType:)]) {
        // 告诉代理,点击的是下一个button
        [_toolDelegate keyboardTool:self buttonType:kKeyboardToolButtonTypeNext];
    }
}

// 点击了完毕button
- (void)doneBtnClicked {
    if ([_toolDelegate respondsToSelector:@selector(keyboardTool:buttonType:)]) {
        // 告诉代理,点击的是完毕button
        [_toolDelegate keyboardTool:self buttonType:kKeyboardToolButtonTypeDone];
    }
}
@end

KeyboardToolDelegate.h

//
//  KeyboardToolDelegate.h
//  22_键盘综合案例
//
//  Created by beyond on 14-8-24.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>
@class KeyboardTool;

@protocol KeyboardToolDelegate <NSObject>
- (void)keyboardTool:(KeyboardTool *)tool buttonType:(KeyboardToolButtonType)type;
@end

BeyondViewController.h

//
//  BeyondViewController.h
//  22_键盘综合案例
//
//  Created by beyond on 14-8-24.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "KeyboardTool.h"
#import "KeyboardToolDelegate.h"

@interface BeyondViewController : UIViewController <UITextFieldDelegate, UIPickerViewDataSource, UIPickerViewDelegate, KeyboardToolDelegate>
// 生日输入框
@property (weak, nonatomic) IBOutlet UITextField *birthdayTextField;
// 城市输入框
@property (weak, nonatomic) IBOutlet UITextField *cityTextField;

@end

BeyondViewController.m

//
//  BeyondViewController.m
//  22_键盘综合案例
//
//  Created by beyond on 14-8-24.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondViewController.h"

@interface BeyondViewController ()

// 全部省名组成的数组
@property (nonatomic, strong) NSArray *provinceNameArr;
// 字典:省名key---value城市名组成的数组
@property (nonatomic, strong) NSDictionary *provinceName_cities_Dict;
// 当前激活的活跃状态的输入框
@property (nonatomic, weak) UITextField *currentTextField;
// 键盘上的工具条
@property (nonatomic, weak) KeyboardTool *tool;
// 全部输入框控件 组成的数组
@property (nonatomic, strong) NSMutableArray *allTextFields;

@end

@implementation BeyondViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.allTextFields = [NSMutableArray array];
    // 类方法,实例化一个KeyboardTool对象
    self.tool = [KeyboardTool keyboardTool];
    self.tool.backgroundColor = [UIColor clearColor];
    self.tool.barTintColor = [UIColor lightGrayColor];

	// 而且设置键盘工具的代理为当前控制器,用于接收其内部的btn点击事件,感知btnType
    self.tool.toolDelegate = self;

    // 1.设置全部文本框的键盘工具条 都是 自己定义的KeyboardTool
    for (UITextField *field in self.view.subviews)
    {
		// 假设不是文本输入框,继续
        if (![field isKindOfClass:[UITextField class]]) continue;

		// 每个文本输入框的键盘工具都是它...
        field.inputAccessoryView = self.tool;
		// 数组保存全部的文本输入框控件,后面要用到
        [self.allTextFields addObject:field];
        // 设置每个文本输入框的代理都是当前控制器
        field.delegate = self;
    }

    // 2.为生日输入框,设置键盘为DatePicker
    [self setInputViewForBirthdayTextField];

    // 3.为城市输入框,设置键盘为DatePicker
    [self  setInputViewForCityTextField];

    // 4.载入全部的数据
    [self  loadAllData];

}

// 2.为生日输入框,设置键盘为DatePicker
- (void)setInputViewForBirthdayTextField
{
    // 设置生日的键盘(不用设置宽高和位置)
    UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    // 设置区域为中国中文简体
    datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
    // 模式为:仅仅显示日期
    datePicker.datePickerMode = UIDatePickerModeDate;
    // 监听datePicker的值改事件
    [datePicker addTarget:self action:@selector(datePickerValueChangeed:) forControlEvents:UIControlEventValueChanged];
    // 设置其为生日输入框的view
    self.birthdayTextField.inputView = datePicker;
}

// 3.为城市输入框,设置键盘为DatePicker
- (void)setInputViewForCityTextField
{
    // 设置城市的键盘
    UIPickerView *picker = [[UIPickerView alloc] init];
    // 设置数据源和代理
    picker.dataSource = self;
    picker.delegate = self;
    // 显示指示器
    picker.showsSelectionIndicator = YES;
    // 设置其为城市输入框的view
    self.cityTextField.inputView = picker;
}
// 4.载入全部的数据
- (void)loadAllData
{
    // 载入省份数据
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]];
    // 全部以省名组成的数组
    self.provinceNameArr = dict[@"provinces"];
    // 字典,键是省名,值是城市名组成的数组
    self.provinceName_cities_Dict = dict[@"cities"];
}

// 2.1监听生日选择控件的值改变事件,为生日输入框赋值
- (void)datePickerValueChangeed:(UIDatePicker *)picker
{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"yyyy-MM-dd";
    // 生日输入框赋值
    self.birthdayTextField.text = [formatter stringFromDate:picker.date];
}

#pragma mark - PickerView数据源方法
// 一共多少列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    // 第一列是省名,第二列是省名相应的城市数组
    return 2;
}
// 每一列相应多少行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0) {
        // 返回省名数组的长度
        return self.provinceNameArr.count;
    } else {
        // 返回第1列   当前选中的行号
        NSUInteger rowNum = [pickerView selectedRowInComponent:0];
        // 先从省名数组,取出相应的省名
        NSString *pName = self.provinceNameArr[rowNum];
        // 再从字典中,通过省名,获取城市数组,并返回其长度
        NSArray *cityArr = self.provinceName_cities_Dict[pName];
        return cityArr.count;
    }
}

// 每列每行显示什么数据
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0) {
		//前一列,显示省名
        return self.provinceNameArr[row];
    } else {
        // 返回第1列   当前选中的行号
        NSUInteger rowNum = [pickerView selectedRowInComponent:0];
        // 先从省名数组,取出相应的省名
        NSString *pName = self.provinceNameArr[rowNum];
        // 再从字典中,通过省名,获取城市数组,并返回其长度
        NSArray *cityArr = self.provinceName_cities_Dict[pName];
        return cityArr[row];
    }
}
// UIPickerView选中了某一行就会调用
- (void)pickerView:(UIPickerView *)pickerView
      didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // 刷新后一列的数据,联动效果
    [pickerView reloadComponent:1];

    NSUInteger pRowNum = [pickerView selectedRowInComponent:0];
    // 先从省名数组,取出相应的省名
    NSString *pName = self.provinceNameArr[pRowNum];

    NSUInteger cRowNum = [pickerView selectedRowInComponent:1];
    // 再从字典中,通过省名,获取城市数组,并返回其相应的城市名
    NSArray *cityArr = self.provinceName_cities_Dict[pName];
    NSString *cName = cityArr[cRowNum];
    // 城市输入框赋值
    self.cityTextField.text = [NSString stringWithFormat:@"%@ %@", pName, cName];
}

#pragma mark - 重点!!!!!!!!keyboardTool代理方法
- (void)keyboardTool:(KeyboardTool *)tool
         buttonType:(KeyboardToolButtonType)type
{

    if (type == kKeyboardToolButtonTypeDone) {
		//当点击完毕时,当前活动的输入框,取消第一响应者,退出键盘
        [self.currentTextField resignFirstResponder];
    } else {
		//先取出当前输入框在输入框数组中的索引,
        NSUInteger index = [self.allTextFields indexOfObject:self.currentTextField];
        if (type == kKeyboardToolButtonTypePrevious) {
            //当点击上一个时,索引减1,
            index--;
        } else {
            //当点击下一个时,索引加1,
            index++;
        }
		// 取出相应索引的输入框,成为即将成为的第一响应者,调出相应的键盘
        UITextField *field = self.allTextFields[index];
        [field becomeFirstResponder];
    }
}

#pragma mark - 重点!!!!!!!UITextField代理方法
- (void)textFieldDidBeginEditing:(UITextField *)textField
{

    // 记住被激活的文本框,其它方法keyboardTool:buttonClick:中要用到
    self.currentTextField = textField;

    // 先取得本输入框在全部输入框组成的数组中的索引
    NSUInteger index = [self.allTextFields indexOfObject:textField];
	// 设置下一个按钮的,是否可用
    self.tool.nextBtn.enabled = index != self.allTextFields.count - 1;
	// 设置上一个按钮的,是否可用
    self.tool.previousBtn.enabled = index != 0;

}
// 这个是 UITextField的一个托付方法!
// 利用这个托付 我们在打开键盘的时候。点击return 就能够关闭键盘了
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    // 结束全部编辑,退出全部键盘,而且返回YES就能够
    [self.view endEditing:YES];
    return YES;
}
@end

数据源

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-12 20:36:53

iOS_22自定义键盘工具栏的相关文章

iOS_22自定义键盘工具条

最终效果图: Main.storyboard KeyboardTool.xib KeyboardTool.h // KeyboardTool.h // 键盘处理 // Created by beyond on 14-8-24. // Copyright (c) 2014年 com.beyond. All rights reserved. #import <UIKit/UIKit.h> @protocol KeyboardToolDelegate; typedef enum { kKeyboar

登陆界面 键盘工具栏的xib创建

1 // 2 // LXKeyboardTool.h 3 // 注册界面 4 // 5 // Created by 刘羽 on 16/1/5. 6 // Copyright © 2016年 LX. All rights reserved. 7 // 8 9 #import <UIKit/UIKit.h> 10 11 typedef enum{ 12 keyboardItemTypeNext, 13 keyboardItemTypePrevious, 14 keyboardItemTypeDon

android 自定义键盘 KeyboardView的key 文字颜色发虚模糊

开发中自定义键盘是否遇到文字发虚吗??如下图: 解决办法: 1. 在key的xml中设置key文字不用keyLabel ,而用keyIcon,即用图片来代替文本,但是这种方法比较笨 2.最简单的是在keyboardview中设置两个属性即可: android:shadowColor="@color/c_white" android:shadowRadius="0.0" shadowColor 设置跟你按键的背景色一致即可!!! 这样按键的文字就会显示的很清晰了啊!!

iOS自定义键盘和系统键盘切换且文本输入框一直获得焦点

UITextView用来进行文本输入.方法becomeFirstResponder和resignFirstResponder可以用来进行弹出系统键盘和收下系统键盘. 弹出系统键盘,文本输入框获得焦点.收下系统键盘,文本输入框失去焦点.那么,问题来了. 某个条件下,如点击界面上的某个按钮,展示自定义键盘.再次点击,切换到系统键盘.先收下系统键盘,再展示自定义键盘.比如移动自定义键盘View的Frame.Y.但这时因为收下系统键盘,本文输入框失去焦点.虽然展示了自定义键盘.但用户体验很不好.光标没有

android 自定义键盘,代码实现自定义属性(自定义键盘背景,各个键的背景等)

由于工作需要,所以接触了自定义键盘.但是发现自己写的键盘太过丑陋了一些.废话不多说,先上图     第一张是修改后的.第二张是修改钱的.这基本上就是 OK.接下来就是重点了. android的keyboardview的属性中是有keybackground 的,但是在使用的时候,却发现没有生效.仔细看了下源码才发现.下面的这句话,把属性集合给设置成了空.所以就键盘的属性就一直无法生效. KeyboardView mKeyboardView = new KeyboardView(this, null

Snail—UI学习之自定义键盘及键盘收起(待完善)

在viewController.h中加入代理 #import <UIKit/UIKit.h> @interface WJJRootViewController : UIViewController <span style="color:#FF0000;"><UITextFieldDelegate></span> @end viewController.m中代码展示 #import "WJJRootViewController.h

两种方式自定义标签工具栏

在AppDelegate.m中设置根视图控制器 MainTabbarController.h @interface MainTabbarController : UITabBarController { UIImageView *_selectedImg; UIView *_tabbarView; } - (void)showtabbar:(BOOL)show; MainTabbarController.m #import "MainTabbarController.h" #impor

自定义键盘~新手看

写这日志以及前面的一些简单的东西就是 纯粹的重温一下 记录下自己的点点滴滴  从runtime runloop 到 函数底层 可能是年纪大了 想回顾一下 从入行到现在本人学了java Python PHP Scala C# JS等等一系列的语言  并学以致用 希望以后能有更好的风景~~ 这篇日志很适合新手看 大神勿喷 自定义键盘 应用场景 密码输入 创建 CustomTextField 继承于UITextField KeyBoardView 继承于UIView CustomTextField.h

android自定义键盘(解决弹出提示的字体颜色问题)

最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置.力度.指尖接触屏幕的面积等参数. 在写自定义键盘的时候,用到了国内网上的一些代码,出处是 http://blog.csdn.net/hfsu0419/article/details/7924673 向先人致敬! 然后发现down下来的代码用到我的项目时,出现了各种问题: 1.首先,是一打开应用,就会出现弹出的是系统的输入法键盘,而是不自定义键盘,这个问题是由于EditText会在应用打开的使用获得焦