现在的位置: 首页 > 综合 > 正文

iOS8 数字键盘添加自定义按钮(兼容各个版本以及解决自定义按钮滑动出现的问题)

2017年12月09日 ⁄ 综合 ⁄ 共 2379字 ⁄ 字号 评论关闭

插入自定义按钮前:

插入自定义按钮后:

相信大家在网上都看过了不少为自定义按钮的方法了,所以方法的具体含义这里就不详细解释了,因为我也不是很懂,这里我就直接讲实现吧。

首先第一步:

在viewdidLoad函数中添加observer,监听键盘弹出事件,代码如下:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil ];

其中keyboardWillShow:是自己是实现的,当程序监听到键盘弹出事件后执行的响应程序。UIKeyboardWillShowNotification则是Xcode的宏定义,表示键盘弹出事件。

第二步:

实现响应函数,代码如下(抄袭后修改):

- (void)keyboardWillShow:(NSNotification *)note
{
    if(UI_USER_INTERFACE_IDIOM()!=UIUserInterfaceIdiomPad){
        //NSArray *ws = [[UIApplication sharedApplication] windows];
        if (self.rateTextField.keyboardType != UIKeyboardTypeNumberPad){
            return;
        }
        // locate keyboard view
        UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
        UIView* keyboard;
        CGRect appRect=[[UIScreen mainScreen] applicationFrame];
        
        for(int i=0; i<[tempWindow.subviews count]; i++) {
            keyboard = [tempWindow.subviews objectAtIndex:i];
            // keyboard view found; add the custom button to it
            if(([[keyboard description] hasPrefix:@"<UIPeripheralHostView"] == YES)||
               [[keyboard description] hasPrefix:@"<UIKeyboard"] == YES||
               [[keyboard description] hasPrefix:@"<UIInputSetContainerView"]==YES)
            {//this line is for ios8
                CGRect frame = CGRectMake(0.0f, 162.0f, 106.0f, 53.0f);
                if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
                    frame = CGRectMake(0, appRect.size.height-33, 106.0f, 53.0f);
                }
                self.numKeyBoardBtn = [UIButton buttonWithType:UIButtonTypeSystem];
                [self.numKeyBoardBtn setTitle:@"完成" forState:UIControlStateNormal];
                [self.numKeyBoardBtn setFrame:frame];
                [keyboard addSubview:self.numKeyBoardBtn];

                break;
            }
        }
    }
}

其中self.rateTextField是自定义的textField,self.numKeyBoardBtn就是键盘需要加上去的按钮,这里把它作为类的成员,目的是为了等下键盘退回的时候能方便调用到它把它移出掉。而代码中3个keyboard description内容的判断就是用来适配不同版本的,具体哪个对应哪个版本可自行网上查。

至此,添加自定义按钮的代码就实现了 (对了,前提是还要自己把keyboardType设置成数字键盘),在ios8上运行,确实可以有了自定义的按钮,但是,效果非常的恶心。每次点击textField,纯数字键盘弹出的时候,都会看到按钮的“完成”字样,是从屏幕中间滑下来的,看起来非常的碍眼。而且,当把sdk的版本切换为7.1的时候,按钮直接就不出来了。查了很多方法,才开到一个说法是:什么键盘的view会在下一个event loop才会出现,所以要delay什么的,具体的看原作者的文章(文章说的事老到掉牙的ios4,我无奈之下才试了他的方法),http://blog.csdn.net/z251257144/article/details/7996197

好的,按照文章的说,修改代码,把observer的代码改成如下:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShowOnDelay) name:UIKeyboardWillShowNotification object:nil ];

这里修改了响应函数。

然后实现keyboardShowOnDelay,代码如下:

- (void) keyboardShowOnDelay
{
    [self performSelector:@selector(keyboardWillShow:) withObject:nil afterDelay:0];
}

这里代码的具体含义我也不懂,只是仿造大神的方法。

做了如上的修改后,以上的两个问题都解决了。按钮不会滑动出现,ios7的按钮也可以出现了,大家可以试试。

抱歉!评论已关闭.