自定义键盘~新手看

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

自定义键盘 应用场景 密码输入

创建

CustomTextField 继承于UITextField

KeyBoardView 继承于UIView

CustomTextField.h

@interface CustomTextField : UITextField

/*
 指定区域,提醒文字,左视图图片名字
 */
- (instancetype)initWithFrame:(CGRect)frame
               withPlacHolder:(NSString *)holder
            withLeftImageName:(NSString *)name;

@end

CustomTextField.m

#import "CustomTextField.h"

@interface CustomTextField ()
///用来记录图片名字的属性
@property (copy, nonatomic) NSString *leftImagName;
///用来记录提醒文字(水印)的属性
@property (copy, nonatomic) NSString *textHolder;
///左视图
@property (strong, nonatomic) UIImageView *leftImageView;
@end

@implementation CustomTextField

- (instancetype)initWithFrame:(CGRect)frame
               withPlacHolder:(NSString *)holder
            withLeftImageName:(NSString *)name{
    //记录相关名字
    self.leftImagName = name;
    self.textHolder = holder;
    return [self initWithFrame:frame];
}
/*
  进行初始化设置
 */
- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {
        ///当前文本框的基本配置(leftView)
        //编辑的时候,显示清除按钮
        self.clearButtonMode = UITextFieldViewModeWhileEditing;
        //设置当前文本框的背景图
        self.background = [UIImage imageNamed:@"background"];
        //设置提醒文字
        self.placeholder = self.textHolder;
        //设置左视图
        self.leftView =  self.leftImageView;
        //设置左视图呈现的形式(默认不出现)
        self.leftViewMode =  UITextFieldViewModeAlways;
    }
    return self;
}

#pragma mark
#pragma mark  Attribute

- (UIImageView *)leftImageView{
    if (!_leftImageView) {
        _leftImageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 5, 35, 35)];
        [_leftImageView setImage:[UIImage imageNamed:self.leftImagName]];
        //内容填充的方式(默认的拉伸填充)
        _leftImageView.contentMode = UIViewContentModeCenter;
    }
    return _leftImageView;
}

@end

KeyBoardView.h

#import <UIKit/UIKit.h>
@class KeyBoardView;

@protocol KeyBoardViewDelegate <NSObject>
//代理方法,用来回传点击按钮上的数据
- (void)sendMessageInView:(KeyBoardView *)bView
              backContent:(NSString *)content;
@end

//1
typedef void(^Block)(KeyBoardView *,NSString *);

@interface KeyBoardView : UIView
///代理对象
@property (assign, nonatomic) id <KeyBoardViewDelegate>delegate;
///2block 属性
@property (copy, nonatomic) Block myBlock;

//给myBlock指向一个代码块的方法
- (void)viewWithBlock:(Block)inBlock;

@end

KeyBoardView.m

#import "KeyBoardView.h"

static CGFloat const kMargin = 20;
static NSUInteger const kBtnCountInRow = 3;
static CGFloat const kBtnHeight = 35;

#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width

@interface KeyBoardView ()

@property (copy, nonatomic) NSArray *arrBtnTitles;

@end

@implementation KeyBoardView

- (instancetype)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]) {

        CGFloat btnWidth = (SCREEN_WIDTH - (kMargin * (kBtnCountInRow + 1)))/kBtnCountInRow;

        //循环创建按钮,添加到当前视图中
        for (int i = 0; i < self.arrBtnTitles.count; i++) {
            UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
            //设置按钮标题
            [btn setTitle:self.arrBtnTitles[i] forState:UIControlStateNormal];
            //行
            int x = i % kBtnCountInRow;
            //列
            int y = i / kBtnCountInRow;
            //设置按钮的区域
            [btn setFrame:CGRectMake(kMargin + x *(kMargin + btnWidth), kMargin + y * (kMargin + kBtnHeight), btnWidth, kBtnHeight)];
            //给按钮设置个颜色
            [btn setBackgroundColor:[UIColor orangeColor]];
            //给按钮标题设置颜色
            [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            //给按钮关联事件
            [btn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];
            //将按钮加入到视图中
            [self addSubview:btn];
        }
    }
    return self;
}
///按钮关联的事件
- (void)btnPressed:(UIButton *)btn{
    [UIView animateWithDuration:0.1 animations:^{
        btn.alpha = 1.0;
        btn.alpha = 0.2;
        btn.alpha = 1.0;
//        btn.transform = CGAffineTransformMakeScale(2.5, 2.5);
//        btn.transform = CGAffineTransformMakeScale(1.0, 1.0);
    }];

    NSLog(@"%@",btn.titleLabel.text);
    //判断代理对象是否响应方法,如果响应才调用
//    if ([self.delegate respondsToSelector:@selector(sendMessageInView:backContent:)]) {
//        [self.delegate sendMessageInView:self backContent:btn.titleLabel.text];
//    }
    //使用block进行数据回传(调用myBlock)
    self.myBlock(self,btn.titleLabel.text);
    //给按钮执行动画

}

///让myBlock指向一个代码块
- (void)viewWithBlock:(Block)inBlock{
    self.myBlock = inBlock;
}

#pragma mark
#pragma mark  Attribute
///存储按钮标题
- (NSArray *)arrBtnTitles{
    if (!_arrBtnTitles) {
        _arrBtnTitles = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"#",@"0",@"*", nil];
    }
    return _arrBtnTitles;
}

然后在ViewController.m调用就可以了

#import "ViewController.h"
#import "CustomTextField.h"
#import "KeyBoardView.h"

@interface ViewController ()<KeyBoardViewDelegate,UITextFieldDelegate>
///自定义文本框
@property (strong, nonatomic) CustomTextField *tfName;
///自定义键盘
@property (strong, nonatomic) KeyBoardView *cusInputView;
///记录文本内容的字符串
@property (strong, nonatomic) NSMutableString *textFieldContents;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor grayColor];
    [self.view addSubview:self.tfName];
    //接受block回传的数据
    [self.cusInputView viewWithBlock:^(KeyBoardView *kView, NSString *content) {
        //将回传的数据追加
        [self.textFieldContents appendString:content];
        //设置tfName的文本内容
        self.tfName.text = self.textFieldContents;
    }];
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self.view endEditing:YES];
}

#pragma mark
#pragma mark  delegate
// 协议中的方法
- (void)sendMessageInView:(KeyBoardView *)bView backContent:(NSString *)content{
    //将回传的数据追加
    [self.textFieldContents appendString:content];
    //设置tfName的文本内容
    self.tfName.text = self.textFieldContents;
}
/*
 点击清除按钮的时候,该方法回调
 */
- (BOOL)textFieldShouldClear:(UITextField *)textField{
    //原来记录内容的字符串给空值
    [self.textFieldContents replaceCharactersInRange:NSMakeRange(0, self.textFieldContents.length) withString:@""];
    return YES;
}

#pragma mark
#pragma mark  Attribute
- (CustomTextField *)tfName{
    if (!_tfName) {
        _tfName = [[CustomTextField alloc]initWithFrame:CGRectMake(0, 80, CGRectGetWidth(self.view.frame), 45) withPlacHolder:@"输入名字" withLeftImageName:@"userName"];
        //设置文本框的inputView(自定义键盘)
        _tfName.inputView = self.cusInputView;
        //设置代理(用来点击清除按钮的时候,回调)
        _tfName.delegate = self;
        //inputAccessoryView

        UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 40)];
        headerView.backgroundColor = [UIColor blackColor];
        _tfName.inputAccessoryView = headerView;

    }
    return _tfName;
}
- (KeyBoardView *)cusInputView{
    if (!_cusInputView) {
        _cusInputView = [[KeyBoardView alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 250)];
        //设置代理对象
        _cusInputView.delegate = self;
    }
    return _cusInputView;
}

- (NSMutableString *)textFieldContents{
    if (!_textFieldContents) {
        _textFieldContents = [NSMutableString string];
    }
    return _textFieldContents;
}

@end

是不是 Very simple~~

时间: 2024-12-25 07:14:04

自定义键盘~新手看的相关文章

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

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

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.但这时因为收下系统键盘,本文输入框失去焦点.虽然展示了自定义键盘.但用户体验很不好.光标没有

Linux下Gvim 的基本操作-适合新手看

Linux下Gvim 的基本操作 vi 有三种方式 编辑方式 插入方式 命令方式在命令方式下,所有命令以“:”开始,所键入的字符系统均作为命令处理在命令方式下,按下i就会进入插入模式,用户输入的可视字符都添加到文件中,按下Esc键,就回到命令状态 基本命令光标命令:k,j,h,l-----上下左右移动光标nG-------跳转命令.n为行数,该命令立即跳转到指定的行Ctrl+G -----报告光标所在位置的行数和列数w,b----- 使光标向前或者向后跳过一个单词 编辑命令:i,a,r----在

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

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

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

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

《程序员成长路线》之新手看高手

1.10 新手看高手 入门之前,很多程序员心里有一个高手情结.通过书籍.媒体.传说渲染,他们认为IT行业是一个高手林立的行业,好像这些高手创造了这个行业的奇迹.这些高手可能是国外的,也可能是中国的.这个高手可能是一个具体的人,也可能抽象于某些著名软件背后看不见的程序员.只知其名,不闻其声,这个时候的高手是一种无所不能的神,一种虚幻,是令程序员崇拜的偶像. 到了工作岗位之后,这种高手情结更加严重,由于新手发现自身技术水平有限,而内心想尽快摆脱这种状况,使得很多新手对高手感觉更加恐惧和渴望.我发现在

iOS IM开发建议(三)添加一个自定义键盘

各类的主流IM,都有自己定义的键盘:有表情键盘,选图片的键盘.其实都是一个inputView. 首先,我们要确定,我们的键盘是输入框调用的.也就是,我们可以设置的是某一个textView的inputView. // 让键盘进入编辑状态,替换输入源为自定义的fv // fv 是一个自定义的UIView - (void)callFaceKeyBoard:(UIButton *)button { [ktextView becomeFirstResponder]; ktextView.inputView

vue教程2-08 自定义键盘信息、监听数据变化vm.$watch

vue教程2-08 自定义键盘信息 @keydown.up @keydown.enter @keydown.a/b/c.... 自定义键盘信息: Vue.directive('on').keyCodes.ctrl=17; Vue.directive('on').keyCodes.myenter=13; @keydown.a/b/c.... <input type="text" @keydown.c="show"> 自定义键盘信息: Vue.directi