iOS数字键盘自定义按键

UIKeyboardTypeNumberPad 数字键盘自定义按键


最近做一个搜索用户的功能,这里使用了UISearchBar。由于搜索的方式只有手机号码,所以这里的键盘要限制为数字输入,可以这么做:

self.searchBar.keyboardType = UIKeyboardTypeNumberPad;

如果使用的不是搜索框而是textField输入框,可以设置textField的键盘属性来展示

self.textField.keyboardType = UIKeyboardTypeNumberPad;

监听事件如下所示即可。
 

但是这里有个问题,就是数字键盘上面没有“搜索”按钮,这样子用户在输入完手机号码后无法搜索。所以这个时候我们需要自己添加一个自定义的搜索按钮,然后加到键盘上面。

解决思路

  1. 自定义搜索button
  2. 监听键盘出现的事件
  3. 遍历搜索的Windows窗体,找到键盘的窗体,然后遍历其子视图,找到我们真正需要的键盘视图
  4. 把我们自定义的按钮加到上面找到的视图里

这里要注意的一点,随着iOS SDK的不断发展,keyboard的视图名称也不断在更新变化,当你调试以下代码无法得到期待的效果时,请重新遍历一次窗台,然后慢慢调试,找到真正需要的视图名称。

解决代码

1.自定义搜索按钮
// 搜索按钮
    _searchButton = [UIButton buttonWithType:UIButtonTypeCustom];
    _searchButton.frame = CGRectMake(0, 163, 106, 53);
    [_searchButton setTitle:@"搜索" forState:UIControlStateNormal];
    [_searchButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [_searchButton addTarget:self action:@selector(SearchButtonDidTouch:) forControlEvents:UIControlEventTouchUpInside]; 
2.监听键盘出现的事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShowOnDelay:) name:UIKeyboardWillShowNotification object:nil];

- (void)keyboardWillShowOnDelay:(NSNotification *)notification {
     [self performSelector:@selector(keyboardWillShow:) withObject:nil afterDelay:0];
}

这里面监听通知后的执行函数并非立马执行查找窗体的函数,是因为在iOS4后,键盘添加到窗体的事件放到了下一个EventLoop,所以我们采用了延迟的方法。

3. 遍历视图,并添加按钮
- (void)keyboardWillShow:(NSNotification *)notification {

    UIView *foundKeyboard = nil;
    UIWindow *keyboardWindow = nil;

    for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
        if (![[testWindow class] isEqual:[UIWindow class]]) {
            keyboardWindow = testWindow;
            break;
        }
    }

    if (!keyboardWindow) return;

    for (__strong UIView *possibleKeyboard in [keyboardWindow subviews]) {

        if ([[possibleKeyboard description] hasPrefix:@"<UIInputSetContainerView"]) {
            for (__strong UIView *possibleKeyboard_2 in possibleKeyboard.subviews) {
                if ([possibleKeyboard_2.description hasPrefix:@"<UIInputSetHostView"]) {
                    foundKeyboard = possibleKeyboard_2;
                }
            }
        }
    }

    if (foundKeyboard) {
        if ([[foundKeyboard subviews] indexOfObject:_searchButton] == NSNotFound) {
            [foundKeyboard addSubview:_searchButton];
        } else {
            [foundKeyboard bringSubviewToFront:_searchButton];
        }
    }
}

时间: 2024-08-27 05:14:46

iOS数字键盘自定义按键的相关文章

IOS数字键盘加完成按钮

1.xib上的名为valueTextField的文本输入框的属性改为如下情形 2.插座变量 @property (weak, nonatomic) IBOutlet UITextField *valueTextField; 3.取消第一响应者 -(void)numberFieldCancle{ [self.valueTextField resignFirstResponder]; } 3.生成ToolBar - (UIToolbar *)addToolbar { UIToolbar *toolb

一个高仿闲鱼键自定义数字键盘特效

博客地址: http://www.jianshu.com/p/be68facfc4b8 仿造android端闲鱼发布选择价格数字键盘,自定义数字键盘 public class MyKeyBoardView extends KeyboardView { private Context mContext; private Keyboard mKeyBoard; public MyKeyBoardView(Context context, AttributeSet attrs) { super(con

【笔记】移动端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 TextField数字键盘的限制位数处理(特别适用于手机登陆)

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

Android 自定义的数字键盘 支持随意拖动 和稳定的字符输入的控件

经过 研究 实现了自定义 键盘 ,支持随意拖动 和数字及其他字符输入 下面是主要的代码 和使用方法 import android.content.Context; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.Gravity; import android.view.Mo

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘的.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看

IOS开发之自定义系统弹出键盘上方的view

IOS开发之自定义系统弹出键盘上方的view 分类: IOS 2014-11-18 09:26 1304人阅读 评论(0) 收藏 举报 目录(?)[+] 这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view.目前就我的经验来看,有两种解决方法.一个就是利用 UITextField或者UITextView的inputAccessoryView属性,另一种,就是监听键盘弹出的notification来自 己解决相关视图的位置问题. 第一种解决方法相对比较简单,第二种的方法中

Android 自定义数字键盘

业务需求自定义数字键盘,写了一个demo 主要代码: import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.DisplayMetrics; import android.view.View; import android.view.WindowManager; import android.vi

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

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