2011-01-10 113 views
55

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

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

+0

我回答了一个非常类似的问题(链接到我的回答下面:http://stackoverflow.com/a/13351686/937822),它创建了一个自定义键盘。我将其开源并将其放在Github上供所有人使用,并且最近添加了一个带有六角键盘的示例。如果你只想要一个-c和1-3,你只需要删除额外的按钮! – lnafziger 2013-02-19 04:39:19

回答

38

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

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

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


这可以作为一个很好的介绍:customizing the iOS keyboard

+1

这个链接是一半的帮助。它告诉你所有关于创建自定义键盘的可能性以及接受文本的类必须符合哪些类别才能接受来自自定义键盘的输入......但几乎不会告诉你如何去构建自定义键盘本身。一些示例代码的链接将非常有用。 – 2011-12-22 12:43:31

+0

@罗伯特,你是对的。我没有找到答案,放弃了。如果您找到解决方案,请告诉我。 – HM1 2012-02-14 02:43:55

3

首先创建一个视图(我做到了,在一个单独的笔尖文件并加载它这样):

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; 
2

不幸的是,上面引用的“用于iOS的文本,Web和编辑编程指南”没有给出任何有关在按下某个键时如何处理该字符的信息。这是在iOS中实现键盘时最难的部分。

我已经创建了一个十六进制数字键盘的完整工作示例,可以很容易地按照您的需要进行自定义。

具体细节都在我对这个问题对方回答:https://stackoverflow.com/a/13351686/937822

2

你要设置的值

inputView 

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

或者,

inputAccessoryView 

可用于添加的功能性的量小。该视图将放置在系统键盘的上方,并将抵达并被解散。