如何创建自定义键盘

时间:2011-01-10 02:12:45

标签: iphone objective-c ios keyboard

如何创建自定义键盘/键盘,当有人点击UITextField时会显示?我想显示一个键盘,其中包含a,b,c,1,2,3和一个输入按钮,没有别的。键盘应该像标准键盘一样工作和行为(在行为上),但它肯定会有所不同。

我找不到任何示例,我发现最好的是使用现有键盘过滤字符,这是一种不可接受的解决方案。

5 个答案:

答案 0 :(得分:38)

我认为你正在寻找“Text, Web, and Editing Programming Guide for iOS

  

UIKit框架包括对自定义输入视图和输入附件视图的支持。当用户在视图中编辑文本或其他形式的数据时,您的应用程序可以用自己的输入视图替换系统键盘。例如,应用程序可以使用自定义输入视图从符文字母表中输入字符。您还可以将输入附件视图附加到系统键盘或自定义输入视图;此附件视图沿主输入视图的顶部运行,并且可以包含,例如,以某种方式影响文本的控件或显示有关文本的一些信息的标签。

     

如果您的应用程序使用UITextView和UITextField对象进行文本编辑,要获得此功能,只需将自定义视图分配给inputView和inputAccessoryView属性即可。当文本对象成为第一响应者时,将显示这些自定义视图...


这可能是一个很好的介绍:customizing the iOS keyboard

答案 1 :(得分:5)

您可以在Github上使用Custom-iOS-Keyboards库。

答案 2 :(得分:3)

首先创建一个视图(我在一个单独的nib文件中完成并以这种方式加载它):

    NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ReducedNumericKeyboardView"
                                                   owner:self
                                                 options:nil];
    keyBView = (ReducedNumericKeyboardView*)[views objectAtIndex:0];

之后,我将其设置为我想要使用它的文本字段的输入视图(实际上,这是您问题的简短答案;)):

    [self.propertyEditor setInputView:keyBView];  

当点击该字段时,我会滚动视图小狗(如有必要)以覆盖该字段:

CGRect textFieldRect = [self.tableViewController.view.window convertRect:propertyEditor.bounds fromView:propertyEditor];
CGRect viewRect = [self.tableViewController.view.window convertRect:self.tableViewController.view.bounds fromView:self.tableViewController.view];
CGFloat midLine = textFieldRect.origin.y+.5*textFieldRect.size.height;

CGFloat numerator = midLine - viewRect.origin.y - MINIMUM_SCROLL_FRACTION*viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)*viewRect.size.height;
CGFloat heightFraction = MIN(1, MAX(0, numerator/denominator));

animateDistance = floor(PORTRAIT_USER_INPUT_VIEW_HEIGHT*heightFraction);

CGRect viewFrame = self.tableViewController.view.frame;
viewFrame.origin.y -= animateDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
[self.tableViewController.view setFrame:viewFrame];
[UIView commitAnimations];

编辑完成后,我会向下滚动视图:

        CGRect viewFrame = self.tableViewController.view.frame;
        viewFrame.origin.y += animateDistance;
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:USER_INPUT_ANIMATION_DURATION];
        [self.tableViewController.view setFrame:viewFrame];
        [UIView commitAnimations];

我使用的约束设置如下:

static const CGFloat USER_INPUT_ANIMATION_DURATION = 0.3;
static const CGFloat PORTRAIT_USER_INPUT_VIEW_HEIGHT = 180;

static const CGFloat MINIMUM_SCROLL_FRACTION = 0.1;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.2;

答案 3 :(得分:2)

不幸的是,上面引用的“文本,Web和编辑iOS编程指南”没有提供任何关于如何在按键时对角色做什么的信息。在iOS中实现键盘时,这是迄今为止最难的部分。

我已经创建了一个十六进制数字键盘的完整工作示例,可以根据需要轻松定制。

具体细节是关于此主题的另一个答案:https://stackoverflow.com/a/13351686/937822

答案 4 :(得分:2)

您想要设置

的值
inputView
在您的UITextField上

。您需要在您提供的视图中完全实现新的键盘或输入机制。

可替换地,

inputAccessoryView 

可用于添加少量功能。该视图将被放置在系统键盘上方,并将随之被解除。