如何创建自定义键盘

Posted

技术标签:

【中文标题】如何创建自定义键盘【英文标题】:How to create a custom keyboard 【发布时间】:2011-06-06 07:16:00 【问题描述】:

如何创建一个自定义键盘/小键盘,当有人点击 UITextField 时会显示它?我想显示一个带有 a、b、c、1、2、3 和输入按钮的键盘,仅此而已。小键盘应该像标准键盘一样工作和表现(在行为上),但它看起来肯定会有所不同。

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

【问题讨论】:

我回答了一个非常相似的问题(链接到我下面的答案:***.com/a/13351686/937822),它创建了一个自定义键盘。我将其开源并放在 Github 上供所有人使用,最近还添加了一个带有十六进制键盘的示例。如果只需要 a-c 和 1-3,则只需删除多余的按钮! 【参考方案1】:

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

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

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


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

【讨论】:

这个链接是半有用的。它告诉您创建自定义键盘的可能性以及您的文本接受类必须符合哪些类别才能接受来自自定义键盘的输入......但几乎没有告诉您如何构建自定义键盘键盘本身。一些示例代码的链接将非常有用。 @Robert,你是对的。我没有找到答案并放弃了。如果您找到解决方案,请告诉我。 我整理了一个基本示例,用于实现您可能想要自定义输入视图的几个案例,希望对您有所帮助。查看更新的答案。 Jonah 的例子真的很棒。通过查看这些,我能够确定您可以简单地实例化一个 UIView 对象并将其分配给您的 UITextField 实例的 inputView 属性 - 如 myTextField.inputView = [[UIView alloc] ...];覆盖键盘 这是一个完全没用的链接【参考方案2】:

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

【讨论】:

【参考方案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;

【讨论】:

大家对这个问题有任何改进,因为你们中的一些人已经做了一些研究(并且可能已经找到了解决方案),如果您发现有用的东西,请发布......【参考方案4】:

你想设置的值

inputView

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

或者,

inputAccessoryView 

可用于添加少量功能。视图将放置在系统键盘上方,并随之到达并被关闭。

【讨论】:

【参考方案5】:

不幸的是,上面引用的“iOS 的文本、Web 和编辑编程指南”没有提供任何关于一旦按下某个键后如何处理字符的信息。在 iOS 中实现键盘时,这是迄今为止最困难的部分。

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

具体细节在我关于这个主题的另一个回答中:https://***.com/a/13351686/937822

【讨论】:

以上是关于如何创建自定义键盘的主要内容,如果未能解决你的问题,请参考以下文章

iphone中的自定义键盘

iOS 8 自定义键盘

如何使用Swift在Xcode上创建自定义数字键盘? [关闭]

将自定义键盘嵌入uiview

自定义数字键盘 UIKeyboard

如何制作Android自定义键盘?