UIKit允許app用自定義的輸入視圖替換系統(tǒng)鍵盤。它還允許app有一個附加視圖在系統(tǒng)鍵盤或自定義輸入視圖之上。另外,它允許app在用戶點擊輸入視圖或輸入附件視圖的控件的時候播放鍵盤敲擊音。
輸入視圖和輸入附加視圖
UIKit框架包括對自定義輸入視圖和輸入附加視圖的支持。當用戶在視圖中編輯文本或其他數據格式的時候,app可以用自己的輸入視圖來替換系統(tǒng)鍵盤。例如,app可以使用自定以輸入視圖來輸入符文字母。你還可以給系統(tǒng)鍵盤或自定義輸入視圖添加輸入附加視圖,這個附加視圖在主輸入視圖之上,例如,以某種方式影響文本的控件,或顯示相關文本的一些信息。
如果你的app使用UITextView和UITextField對象來編輯文本,想要獲取該功能,可以簡單的分配自定義視圖到inputView和inputAccessoryView屬性。這些自定義視圖在文本對象變?yōu)榈谝豁憫叩臅r候顯示。
你的輸入視圖和輸入附加視圖不限于框架提供的文本對象。任何直接或者間接繼承UIResponder的類(通常是自定義視圖)都可以指定它自己的輸入視圖和輸入附加視圖。UIResponder類為輸入視圖和輸入附加視圖聲明了兩個屬性:
@property (readonly, retain) UIView *inputView;
@property (readonly, retain) UIView *inputAccessoryView;
當響應對象變?yōu)榈谝豁憫卟⑶襥nputView(或者inputAccessoryView)不是nil的時候,UIKit可以動畫的把輸入視圖放置在父視圖之下(或者把輸入附加視圖放置在輸入視圖之上)。第一響應者可以通過調用UIResponder的reloadInputViews方法來重新家在輸入和附加視圖。
UITextView類重寫了inputView和inputAccessoryView屬性。UITextView對象的客戶端只需要獲取輸入和輸入附加視圖(可以通過加載nib文件或通過代碼的方式創(chuàng)建),并把它們分配給對象的屬性。自定義視圖類(以及UIResponder的其他子類)應該聲明這兩個屬性以及它們的后背實例變量(backing instance variables)的一個或兩個,并重寫屬性的getter方法,不要合成屬性的訪問器方法。在它們的getter方法實現中,它們應該返回視圖,如果它不存在,就應該加載或創(chuàng)建。
你在定義輸入視圖或輸入附加視圖時有很大的靈活性。盡管這些視圖的高度可以隨你喜歡,但是它們應該有和系統(tǒng)鍵盤一樣的寬度。如果UIKit在它的autoresizing mask中遇到帶有UIViewAutoresizingFlexibleHeight值的輸入視圖,它會把高度設置為和鍵盤匹配。輸入視圖和輸入附加視圖可能擁有的子視圖(例如控件)是沒有數量限制的。更多輸入視圖和輸入附加視圖的指導,參見iOS Human Interface Guidelines。
想要在運行的時候加載nib文件,首先在Interface Builder中創(chuàng)建輸入視圖或輸入附加視圖。然后在運行時得到app的主束,并且在其上調用loadNibNamed:owner:options: ,傳遞nib文件的名字、nib文件的File‘s Owner、以及任何可選項。該方法返回nib文件中的頂層對象的數組,其中包括了輸入視圖和輸入附加視圖。把該視圖分配給它的相應屬性。更多關于此主題的內容,參見Resource Programming Guide中的Nib Files 。
代碼清單 6-1說明了一個自定義視圖類在inputAccessoryView的getter方法中懶創(chuàng)建它的輸入附加視圖。
代碼清單 6-1 用編程的方式創(chuàng)建輸入附加視圖
- (UIView *)inputAccessoryView {
if (!inputAccessoryView) {
CGRect accessFrame = CGRectMake(0.0, 0.0, 768.0, 77.0);
inputAccessoryView = [[UIView alloc] initWithFrame:accessFrame];
inputAccessoryView.backgroundColor = [UIColor blueColor];
UIButton *compButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
compButton.frame = CGRectMake(313.0, 20.0, 158.0, 37.0);
[compButton setTitle: @"Word Completions" forState:UIControlStateNormal];
[compButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[compButton addTarget:self action:@selector(completeCurrentWord:)
forControlEvents:UIControlEventTouchUpInside];
[inputAccessoryView addSubview:compButton];
}
return inputAccessoryView;
}
輸入視圖和輸入附加視圖的自視圖可以是你希望的任何東西。如果它們是按鈕或者其他控件,你需要為每個控件指定目標和方法,并且實現相關的動作方法來執(zhí)行數據輸入或操作。
就像系統(tǒng)鍵盤一樣,UIKit也發(fā)送UIKeyboardWillShowNotification, UIKeyboardDidShowNotification, UIKeyboardWillHideNotification, 和 UIKeyboardDidHideNotification 通知。該對象觀察這些通知,可以得到輸入視圖和輸入附加視圖的相關的幾何信息,并調整相應的編輯視圖。有關示例和相關信息,參見Keyboards and Input Methods。
播放輸入點擊
當用戶點擊自定義輸入視圖和鍵盤附加視圖的時候,你可以播放標準的系統(tǒng)鍵盤點擊音。首先,在你的輸入視圖中采用UIInputViewAudioFeedback協(xié)議。然后,當響應該視圖的鍵盤點擊的時候調用playInputClick方法。
采用UIInputViewAudioFeedback協(xié)議
執(zhí)行以下三個步驟來采用UIInputViewAudioFeedback協(xié)議:
- 在你的Xcode項目中,創(chuàng)建UIView類的子類。在頭文件中,指明該子類遵守UIInputViewAudioFeedback協(xié)議,就像這樣:
@interface KeyboardAccessoryView : UIView <UIInputViewAudioFeedback> {
}
- 在你的UIView子類的實現文件中,實現enableInputClicksWhenVisible方法,如下所示:
- (BOOL) enableInputClicksWhenVisible {
return YES;
}
- 最后,在你的自定輸入或附加視圖的Interface Builder文件中,選擇該視圖對象。在身份檢查器中,設置該對象的類為你的UIView子類。
播放輸入點擊
想要在點擊自定義輸入或鍵盤附加視圖的鍵時播放輸入點擊音,首先要確認該視圖采用了UIInputViewAudioFeedback協(xié)議。然后,為每個點擊提供你想要的點擊聲音,調用UIDevice類的playInputClick方法,如下所示:
- (void) playClickForCustomKeyTap {
[[UIDevice currentDevice] playInputClick];
}
系統(tǒng)自動為自定義輸入點擊管理音頻會話,包括根據需要的音頻回避。(更多關于音頻會話的信息,參見Audio Session Programming Guide。)