2011-01-10 107 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 

可用於添加的功能性的量小。該視圖將放置在系統鍵盤的上方,並將抵達並被解散。