為數據輸入自定義視圖 <- iOS文本編程指南

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é)議:

  1. 在你的Xcode項目中,創(chuàng)建UIView類的子類。在頭文件中,指明該子類遵守UIInputViewAudioFeedback協(xié)議,就像這樣:
@interface KeyboardAccessoryView : UIView <UIInputViewAudioFeedback> {
}
  1. 在你的UIView子類的實現文件中,實現enableInputClicksWhenVisible方法,如下所示:
 - (BOOL) enableInputClicksWhenVisible {
    return YES;
}
  1. 最后,在你的自定輸入或附加視圖的Interface Builder文件中,選擇該視圖對象。在身份檢查器中,設置該對象的類為你的UIView子類。
播放輸入點擊

想要在點擊自定義輸入或鍵盤附加視圖的鍵時播放輸入點擊音,首先要確認該視圖采用了UIInputViewAudioFeedback協(xié)議。然后,為每個點擊提供你想要的點擊聲音,調用UIDevice類的playInputClick方法,如下所示:

- (void) playClickForCustomKeyTap {
   [[UIDevice currentDevice] playInputClick];
}

系統(tǒng)自動為自定義輸入點擊管理音頻會話,包括根據需要的音頻回避。(更多關于音頻會話的信息,參見Audio Session Programming Guide。)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容