美文网首页iOS 开发每天分享优质文章
iOS Custom Keyboard 系统自定义键盘

iOS Custom Keyboard 系统自定义键盘

作者: 帅聪哥 | 来源:发表于2018-11-27 17:41 被阅读333次
    前言

    话说网上有很多关于系统自定义键盘的做法,但是针对系统级别的Custom Keyboard 却很少有人提及,有的也比较片面,说的不够全面。当然这个键盘是系统级别的,如果你需要查看它,要在手机设置->键盘中加入。以下是添加步骤:
    1.Xcode->File->New->Target :


    效果图

    2.接下来系统会生成:

    @interface KeyboardViewController : UIInputViewController
    
    1. 注意:这里是重点,在viewDidLoad 中 由于self.view的frame为(0,0,0,0),所以,为了机型的适配,必须使用约束加入,我在demo里直接拖入了oc版UIView+AutoLayoutswift版UIView+AutoLayout

    好多人问如何设置键盘的高度,其实也是通过约束进行设置,因为根本无法设置高度,只能通过约束进行拉伸,以下是两种不同约束后的效果图

    单个高度约束为40
    单个高度约束为80
    这样就可以完成高度的控制了
    1. UI加入按钮的🌰
    CGFloat buttonInset = 10;
        UIButton *button1 = [self buttonWithTitle:@"1" tag:0];
        [self.view addSubview:button1];
        [button1 autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:buttonInset];
        [button1 autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:buttonInset];
        [button1 autoSetDimension:ALDimensionHeight toSize:40];
        
        UIButton *button2 = [self buttonWithTitle:@"2" tag:1];
        [self.view addSubview:button2];
        [button2 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button1];
        [button2 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button1 withOffset:buttonInset];
        [button2 autoMatchWidthAndHeightofView:button1];
        
        UIButton *button3 = [self buttonWithTitle:@"3" tag:2];
        [self.view addSubview:button3];
        [button3 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button1];
        [button3 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button2 withOffset:buttonInset];
        [button3 autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:buttonInset];
        [button3 autoMatchWidthAndHeightofView:button1];
        
        UIButton *button4 = [self buttonWithTitle:@"4" tag:3];
        [self.view addSubview:button4];
        [button4 autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:buttonInset];
        [button4 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:button1 withOffset:buttonInset];
        [button4 autoMatchWidthAndHeightofView:button1];
        
        UIButton *button5 = [self buttonWithTitle:@"5" tag:4];
        [self.view addSubview:button5];
        [button5 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button4];
        [button5 autoMatchWidthAndHeightofView:button4];
        [button5 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button4 withOffset:buttonInset];
        
        UIButton *button6 = [self buttonWithTitle:@"6" tag:5];
        [self.view addSubview:button6];
        [button6 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button5];
        [button6 autoMatchWidthAndHeightofView:button5];
        [button6 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button5 withOffset:buttonInset];
        [button6 autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:buttonInset];
        
        UIButton *button7 = [self buttonWithTitle:@"7" tag:6];
        [self.view addSubview:button7];
        [button7 autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:buttonInset];
        [button7 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:button4 withOffset:buttonInset];
        [button7 autoMatchWidthAndHeightofView:button1];
        
        UIButton *button8 = [self buttonWithTitle:@"8" tag:7];
        [self.view addSubview:button8];
        [button8 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button7];
        [button8 autoMatchWidthAndHeightofView:button7];
        [button8 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button7 withOffset:buttonInset];
        
        UIButton *button9 = [self buttonWithTitle:@"9" tag:8];
        [self.view addSubview:button9];
        [button9 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button8];
        [button9 autoMatchWidthAndHeightofView:button8];
        [button9 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button8 withOffset:buttonInset];
        [button9 autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:buttonInset];
        
        UIButton *button10 = [self buttonWithTitle:@"切换" tag:9];
        [self.view addSubview:button10];
        [button10 autoPinEdgeToSuperviewEdge:ALEdgeLeft withInset:buttonInset];
        [button10 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:button7 withOffset:buttonInset];
        [button10 autoMatchWidthAndHeightofView:button1];
        [button10 autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:buttonInset];
        
        UIButton *button11 = [self buttonWithTitle:@"0" tag:10];
        [self.view addSubview:button11];
        [button11 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button10];
        [button11 autoMatchWidthAndHeightofView:button10];
        [button11 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button10 withOffset:buttonInset];
        
        UIButton *button12 = [self buttonWithTitle:@"删除" tag:11];
        [self.view addSubview:button12];
        [button12 autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:button11];
        [button12 autoMatchWidthAndHeightofView:button11];
        [button12 autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:button11 withOffset:buttonInset];
        [button12 autoPinEdgeToSuperviewEdge:ALEdgeRight withInset:buttonInset];
    

    快速创建按钮:

    - (UIButton*)buttonWithTitle:(NSString*)title tag:(NSInteger)tag
    {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        [button setBackgroundColor:[UIColor whiteColor]];
        button.titleLabel.font = [UIFont systemFontOfSize:15];
        button.titleLabel.adjustsFontSizeToFitWidth = YES;
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button setTitle:title forState:UIControlStateNormal];
        button.layer.cornerRadius = 4;
        button.layer.masksToBounds = YES;
        if(tag == 9){
            [button addTarget:self action:@selector(handleInputModeListFromView:withEvent:) forControlEvents:UIControlEventAllTouchEvents];
        }else if (tag == 11){
            [button addTarget:self action:@selector(deleteTextContent) forControlEvents:UIControlEventTouchUpInside];
        }else{
            [button addTarget:self action:@selector(buttonClickInputAction:) forControlEvents:UIControlEventTouchUpInside];
        }
        return button;
    }
    

    其他操作:

    - (void)deleteTextContent
    {
        if (self.textDocumentProxy.documentContextBeforeInput) {
            [self.textDocumentProxy deleteBackward];
        }
    }
    
    - (void)buttonClickInputAction:(UIButton*)button
    {
        NSString *title = button.titleLabel.text;
        [self.textDocumentProxy insertText:title];
    }
    

    如果需要添加音效或者震动,首先得找个音效文件,格式mp3或者wav都可以,需要添加到与keyboardViewController同一个文件目录下都可以,因为这个自定义键盘相当于宿主app是另外一个东东了。

    /**
     在文字输入的时候添加输入音效即可
     */
    - (void)playAudio
    {
        NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"keyboard_tap" withExtension:@"mp3"];
        SystemSoundID soundID;
        AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain(fileUrl), &soundID);
        AudioServicesPlaySystemSound(soundID);
        //震动
        //AudioServicesPlayAlertSound(soundID);
    }
    

    我给UIView+AutoLayout添加了一个方法

    - (NSArray *)autoMatchWidthAndHeightofView:(UIView*)ofview
    {
       NSLayoutConstraint *width = [self autoMatchDimension:ALDimensionWidth toDimension:ALDimensionWidth ofView:ofview];
       NSLayoutConstraint *height = [self autoMatchDimension:ALDimensionHeight toDimension:ALDimensionHeight ofView:ofview];
        return @[width,height];
    }
    
    
    当然这只是为了演示效果而已,真是场景还需要自己想一下约束如何添加。

    喜欢的话就点个赞就好了,谢谢!

    相关文章

      网友评论

        本文标题:iOS Custom Keyboard 系统自定义键盘

        本文链接:https://www.haomeiwen.com/subject/kxcnqqtx.html