iOS 开发每天分享优质文章

iOS Custom Keyboard 系统自定义键盘

2018-11-27  本文已影响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];
}

当然这只是为了演示效果而已,真是场景还需要自己想一下约束如何添加。

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

上一篇下一篇

猜你喜欢

热点阅读