ios在数字键盘左下角添加“完成”按钮的实现原理

最近要在系统弹出的数字键盘上的左下角额外添加一个自定制的完成按钮,于是研究了一下系统自带键盘添加自定制按钮的实现方式。总结了一下大体上的通用做法,原理大概是这样:当页面上的文本框或其他输入源因为用户的点击而变成第一响应者的时候(becomeFirstResponder),系统键盘就会弹出。而每次键盘弹出或收起时,都会向系统发送相关的键盘事件即通知消息(notification)。所以,我们只要在键盘弹出或收起时捕获相关的键盘事件,并且在键盘对应的window上的相应位置添加或移除我们自定制的按钮即可。

按照这种思路,在键盘弹出时添加上我们自定制的按钮是完全可行的。但是,如果只是这样简单的处理,造成的效果是:键盘弹出和自定制按钮的添加是不同步的。有时候键盘还没有弹出自定制的按钮就已经加在试图上了,有时候键盘弹出后自定制的按钮才添加上去。那么我们如何使得键盘的弹出和自定制按钮的添加能同步进行呢,要完成这种平滑的过度弹出效果,还需要获得键盘弹出的动画时间和动画类型,然后让自定制按钮的添加动画和键盘的弹出、收起动作同步。

1、首先在 viewWillAppear 方法中注册监听相应的键盘通知,并且要在 viewWillDisappear 方法中注销通知

- (void)viewWillAppear:(BOOL)animated {

    //注册键盘显示通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardDidShow:) name:UIKeyboardWillShowNotification object:nil];
    //注册键盘隐藏通知
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

    [super viewWillAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated{

    //注销键盘显示通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

    [super viewWillDisappear:animated];
}

2、处理键盘弹出和收起事件

// 键盘出现处理事件
- (void)handleKeyboardDidShow:(NSNotification *)notification
{
    // NSNotification中的 userInfo字典中包含键盘的位置和大小等信息
    NSDictionary *userInfo = [notification userInfo];
    // UIKeyboardAnimationDurationUserInfoKey 对应键盘弹出的动画时间
    CGFloat animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
    // UIKeyboardAnimationCurveUserInfoKey 对应键盘弹出的动画类型
    NSInteger animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
    //数字彩,数字键盘添加“完成”按钮
    if (doneInKeyboardButton){

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:animationDuration];//设置添加按钮的动画时间
        [UIView setAnimationCurve:(UIViewAnimationCurve)animationCurve];//设置添加按钮的动画类型

        //设置自定制按钮的添加位置(这里为数字键盘添加“完成”按钮)
        doneInKeyboardButton.transform=CGAffineTransformTranslate(doneInKeyboardButton.transform, 0, -53);

        [UIView commitAnimations];
    }

}
// 键盘消失处理事件
- (void)handleKeyboardWillHide:(NSNotification *)notification
{
    // NSNotification中的 userInfo字典中包含键盘的位置和大小等信息
    NSDictionary *userInfo = [notification userInfo];
    // UIKeyboardAnimationDurationUserInfoKey 对应键盘收起的动画时间
    CGFloat animationDuration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];

    if (doneInKeyboardButton.superview)
    {
        [UIView animateWithDuration:animationDuration animations:^{
            //动画内容,将自定制按钮移回初始位置
            doneInKeyboardButton.transform=CGAffineTransformIdentity;
        } completion:^(BOOL finished) {
            //动画结束后移除自定制的按钮
            [doneInKeyboardButton removeFromSuperview];
        }];

    }
}

3、点击输入框,初始化自定制按钮并弹出键盘

//点击输入框
- (IBAction)editingDidBegin:(id)sender{

    //初始化数字键盘的“完成”按钮
    [self configDoneInKeyBoardButton];
}
//初始化,数字键盘“完成”按钮
- (void)configDoneInKeyBoardButton{
    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    //初始化
    if (doneInKeyboardButton == nil)
    {
        doneInKeyboardButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
        [doneInKeyboardButton setTitle:@"完成" forState:UIControlStateNormal];
        [doneInKeyboardButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

        doneInKeyboardButton.frame = CGRectMake(0, screenHeight, 106, 53);

        doneInKeyboardButton.adjustsImageWhenHighlighted = NO;
        [doneInKeyboardButton addTarget:self action:@selector(finishAction) forControlEvents:UIControlEventTouchUpInside];
    }
    //每次必须从新设定“完成”按钮的初始化坐标位置
    doneInKeyboardButton.frame = CGRectMake(0, screenHeight, 106, 53);

    //由于ios8下,键盘所在的window视图还没有初始化完成,调用在下一次 runloop 下获得键盘所在的window视图
    [self performSelector:@selector(addDoneButton) withObject:nil afterDelay:0.0f];

}

- (void) addDoneButton{
    //获得键盘所在的window视图
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    [tempWindow addSubview:doneInKeyboardButton];    // 注意这里直接加到window上

}
//点击“完成”按钮事件,收起键盘
-(void)finishAction{
    [[[UIApplication sharedApplication] keyWindow] endEditing:YES];//关闭键盘
}

按照这种思路和实现原理,可以在键盘上方等地方添加输入框等其他自定制控件并且可以跟随键盘的弹出和收起平滑过度出现。

时间: 2024-10-01 04:44:02

ios在数字键盘左下角添加“完成”按钮的实现原理的相关文章

iOS8数字键盘左下角添加完成按钮

iOS8数字键盘左下角添加完成按钮的核心代码如下: - (void)addDoneButtonToNumPadKeyboard { UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; if (systemVersion < 8.0){ doneButton.frame = CGRectMake(0, 163, 106, 53); }else{ doneButton.frame = CGRectMake(0, S

iOS TextField数字键盘的限制位数处理(特别适用于手机登陆)

Hi~大家好,这么长时间不和大家见面了,说来惭愧,最近忙于工作,已经很久没有写博客了, 接下来和大家分享一下在iOS下数字键盘限位的处理---好,废话不多说直接上代码 在用手机号登陆的时候大家有没有遇到这个问题? 就是一边想要输入到一定位数要限制输入,但是删除的时候还要能删除,今天小编遇到了这个问题,解决好半天,最终把它解决了,好了接下来给大家分享一下 相信大家都知道,输入框是用 UITextField的吧,其他的都不说了,要用textField的话实现代理方法,最重要的一点是设置他的键盘模式为

iOS为数字键盘增加完成按钮

在输入价格的时候,要求弹出的键盘只能有数字和小数点.弹出的键盘没有完成键,想要退出键盘可以点击退出,但是为了更好的用户体验,在键盘上增加UIToolbar. 设置ToolBar: - (UIToolbar *)addToolbar { UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 30)]; toolbar.tintColor = [U

iOS自定义数字键盘

自定义键盘实际就是设置UITextField的inputView属性,首先我们要做的是自定义一个UIView,实现键盘的样式. 自定义View代码如下: 1 #import <UIKit/UIKit.h> 2 //创建自定义键盘协议 3 @protocol My_KeyBoardDelegate <NSObject> 4 //创建协议方法 5 @required//必须执行的方法 6 - (void)numberKeyBoard:(NSInteger) number; 7 - (v

iOS数字键盘自定义按键

UIKeyboardTypeNumberPad 数字键盘自定义按键 最近做一个搜索用户的功能,这里使用了UISearchBar.由于搜索的方式只有手机号码,所以这里的键盘要限制为数字输入,可以这么做: self.searchBar.keyboardType = UIKeyboardTypeNumberPad; 如果使用的不是搜索框而是textField输入框,可以设置textField的键盘属性来展示 self.textField.keyboardType = UIKeyboardTypeNum

【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)

在Vue中的项目,基于VUX-UI开发,一个常见的需求: 1.金额输入框 2.弹出数字键盘 3.仅支持输入两位小数,限制最大11位数,不允许0开头 第一,首先想到额就是在VUX-UI中制定type=number.--不可行 VUX中的文档和代码说明,type=number不支持maxLength,会报错,而且没有正则替换的处理或者钩子函数,只有输入后提示校验信息. 第二,基于VUX中XInput封装,有如下问题 1)两层v-model,正则替换的值不会触发input框渲染 解决:currentV

iOS 为键盘添加隐藏按钮

// 为键盘添加隐藏按钮 UIToolbar * backView = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 30)]; [backView setBarStyle:UIBarStyleDefault]; UIBarButtonItem * btnSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSp

iOS8数字键盘加左下角完成button

iOS8数字键盘加左下角完成button的核心代码如下面: - (void)addDoneButtonToNumPadKeyboard { UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom]; if (systemVersion < 8.0){ doneButton.frame = CGRectMake(0, 163, 106, 53); }else{ doneButton.frame = CGRectMake(

仿新浪微博IOS客户端(v5.2.8)——自定义UITabBar替换系统默认的(添加“+”号按钮)

转载请标明出处:http://blog.csdn.net/android_ls/article/details/45896395 声明:仿新浪微博项目,所用所有图片资源都来源于官方新浪微博IOS客户端,编写本应用的目的在于学习交流,如涉及侵权请告知,我会及时换掉用到的相关图片. 自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个"+号按钮",下面我们来聊聊具体的实现. 1.自定义WBTabBar,让其继承自UITabBar,代码如下: // // WBT