iOS Custom Keyboard 系统自定义键盘
2018-11-27 本文已影响333人
帅聪哥
前言
话说网上有很多关于系统自定义键盘的做法,但是针对系统级别的Custom Keyboard 却很少有人提及,有的也比较片面,说的不够全面。当然这个键盘是系统级别的,如果你需要查看它,要在手机设置->键盘中加入。以下是添加步骤:
1.Xcode->File->New->Target :
效果图
2.接下来系统会生成:
@interface KeyboardViewController : UIInputViewController
-
注意:这里是重点,在viewDidLoad 中 由于self.view的frame为(0,0,0,0),所以,为了机型的适配,必须使用约束加入,我在demo里直接拖入了oc版UIView+AutoLayout,swift版UIView+AutoLayout
好多人问如何设置键盘的高度,其实也是通过约束进行设置,因为根本无法设置高度,只能通过约束进行拉伸,以下是两种不同约束后的效果图
单个高度约束为80
这样就可以完成高度的控制了
-
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];
}
当然这只是为了演示效果而已,真是场景还需要自己想一下约束如何添加。
喜欢的话就点个赞就好了,谢谢!