TextKit框架詳細(xì)解析 (十一) —— 文本編程指南之輸入數(shù)據(jù)的自定義視圖(七)

版本記錄

版本號 時間
V1.0 2018.09.01

前言

TextKit框架是對Core Text的封裝,用簡潔的調(diào)用方式實現(xiàn)了大部分Core Text的功能惠啄。 TextKit是一個偏上層的開發(fā)框架,在iOS7以上可用,使用它可以方便靈活處理復(fù)雜的文本布局瘟忱,滿足開發(fā)中對文本布局的各種復(fù)雜需求香缺。TextKit實際上是基于CoreText的一個上層框架手销,其是面向?qū)ο蟮摹=酉聛韼灼覀兙鸵黄鹂匆幌逻@個框架图张。感興趣的看下面幾篇文章锋拖。
1. TextKit框架詳細(xì)解析 (一) —— 基本概覽和應(yīng)用場景(一)
2. TextKit框架詳細(xì)解析 (二) —— 基本概覽和應(yīng)用場景(二)
3. TextKit框架詳細(xì)解析 (三) —— 一個簡單布局示例(一)
4. TextKit框架詳細(xì)解析 (四) —— 一個簡單布局示例(二)
5. TextKit框架詳細(xì)解析 (五) —— 文本編程指南之簡介(一)
6. TextKit框架詳細(xì)解析 (六) —— 文本編程指南之展示文本內(nèi)容(二)
7. TextKit框架詳細(xì)解析 (七) —— 文本編程指南之排版概念(三)
8. TextKit框架詳細(xì)解析 (八) —— 文本編程指南之管理Text Fields and Text Views(四)
9. TextKit框架詳細(xì)解析 (九) —— 文本編程指南之管理鍵盤(五)
10. TextKit框架詳細(xì)解析 (十) —— 文本編程指南之復(fù)制、剪切和粘貼操作(六)

Custom Views for Data Input - 輸入數(shù)據(jù)的自定義視圖

UIKit允許應(yīng)用程序替換系統(tǒng)鍵盤的自定義輸入視圖祸轮。 它還使應(yīng)用程序在系統(tǒng)鍵盤或自定義輸入視圖上方具有附件視圖兽埃。 此外,當(dāng)用戶點擊輸入視圖或輸入附件視圖的控件時适袜,它使應(yīng)用程序能夠播放按鍵點擊聲音柄错。


Input Views and Input Accessory Views - 輸入視圖和輸入附件視圖

UIKit框架包括對自定義輸入視圖和輸入附件視圖的支持。當(dāng)用戶在視圖中編輯文本或其他形式的數(shù)據(jù)時,您的應(yīng)用可以用自己的輸入視圖替換系統(tǒng)鍵盤售貌。例如给猾,應(yīng)用程序可以使用自定義輸入視圖從符文字母表中輸入字符。您還可以將輸入附件視圖附加到系統(tǒng)鍵盤或自定義輸入視圖颂跨;此附件視圖沿主輸入視圖的頂部運行敢伸,并且可以包含(例如)以某種方式影響文本的控件或顯示有關(guān)文本的某些信息的label。

要獲得此功能恒削,如果您的應(yīng)用程序使用UITextViewUITextField對象進行文本編輯池颈,只需將自定義視圖分配給inputViewinputAccessoryView屬性即可。當(dāng)文本對象成為第一響應(yīng)者時钓丰,將顯示這些自定義視圖饶辙。

您不僅限于框架提供的文本對象中的輸入視圖和輸入附件視圖。直接或間接從UIResponder繼承的任何類(通常是自定義視圖)都可以指定自己的輸入視圖和輸入附件視圖斑粱。 UIResponder類為輸入視圖和輸入附件視圖聲明了兩個屬性:

@property (readonly, retain) UIView *inputView;
@property (readonly, retain) UIView *inputAccessoryView;

當(dāng)響應(yīng)者對象成為第一個響應(yīng)者并且inputView(或inputAccessoryView)不是nil時弃揽,UIKit將輸入視圖設(shè)置為在父視圖下方的位置(或?qū)⑤斎敫郊晥D附加到輸入視圖的頂部)。第一個響應(yīng)者可以通過調(diào)用UIResponderreloadInputViews方法重新加載輸入和附件視圖则北。

UITextView類將inputViewinputAccessoryView屬性重新聲明為readwrite矿微。 UITextView對象的客戶端只需要獲取輸入和輸入附件視圖 - 通過加載nib文件或在代碼中創(chuàng)建視圖 - 并將它們分配給它們的屬性。自定義視圖類(以及從UIResponder繼承的其他子類)應(yīng)重新聲明這些屬性及其后備實例變量中的一個或兩個尚揣,并重寫屬性的getter方法 - 即涌矢,不合成屬性的訪問器方法。在他們的getter-method實現(xiàn)中快骗,他們應(yīng)該返回視圖娜庇,如果它還不存在則加載或創(chuàng)建它。

您可以在定義輸入視圖或輸入附件視圖的大小和內(nèi)容方面具有很大的靈活性方篮。雖然這些視圖的高度可以是您想要的名秀,但它們應(yīng)該與系統(tǒng)鍵盤的寬度相同。如果UIKit在其自動調(diào)整掩碼中遇到具有UIViewAutoresizingFlexibleHeight值的輸入視圖藕溅,則會更改高度以匹配鍵盤匕得。輸入視圖和輸入附件視圖可能具有的子視圖(例如控件)的數(shù)量沒有限制。有關(guān)輸入視圖和輸入附件視圖的更多指導(dǎo)巾表,請參閱iOS Human Interface Guidelines汁掠。

要在運行時加載nib文件,首先在Interface Builder中創(chuàng)建輸入視圖或輸入附件視圖集币。然后在運行時獲取應(yīng)用程序的主包并調(diào)用loadNibNamed:owner:options:考阱,傳遞nib文件的名稱,nib文件的文件所有者以及任何選項鞠苟。此方法返回nib中頂級對象的數(shù)組乞榨,其中包括輸入視圖或輸入附件視圖秽之。將視圖分配給其對應(yīng)的屬性。有關(guān)此主題的更多信息姜凄,請參閱Resource Programming Guide中的Nib Files

Listing 6-1說明了一個自定義視圖類趾访,它在inputAccessoryView的 getter方法中懶創(chuàng)建其輸入附件視圖态秧。

// Listing 6-1  Creating an input accessory view programmatically

- (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;
}

輸入視圖和輸入附件視圖的子視圖可以是您想要的任何內(nèi)容。 如果它們是按鈕或其他控件扼鞋,則需要為每個控件指定目標(biāo)和操作申鱼,并實現(xiàn)相關(guān)的操作方法以執(zhí)行數(shù)據(jù)輸入或操作。

正如它與系統(tǒng)鍵盤一樣云头,UIKit發(fā)布了UIKeyboardWillShowNotification捐友,UIKeyboardDidShowNotificationUIKeyboardWillHideNotificationUIKeyboardDidHideNotification通知溃槐。 觀察這些通知的對象可以獲得與輸入視圖和輸入附件視圖相關(guān)的幾何信息匣砖,并相應(yīng)地調(diào)整編輯的視圖。 有關(guān)示例和相關(guān)信息昏滴,請參閱Keyboards and Input Methods猴鲫。


Playing Input Clicks

當(dāng)用戶點擊自定義輸入視圖和鍵盤附件視圖時,您可以播放標(biāo)準(zhǔn)系統(tǒng)鍵盤點擊谣殊。 首先拂共,在輸入視圖中采用UIInputViewAudioFeedback協(xié)議。 然后姻几,在響應(yīng)視圖中的鍵擊時調(diào)用playInputClick方法宜狐。

1. Adopting the UIInputViewAudioFeedback Protocol - 采取UIInputViewAudioFeedback協(xié)議

執(zhí)行以下三個步驟以采用UIInputViewAudioFeedback協(xié)議:

  • 1)在Xcode項目中,創(chuàng)建UIView類的子類蛇捌。 在頭文件中抚恒,指示子類符合UIInputViewAudioFeedback協(xié)議,如下所示:
@interface KeyboardAccessoryView:UIView <UIInputViewAudioFeedback> {
}
- (BOOL)enableInputClicksWhenVisible {
     返回YES;
}
  • 3)最后,在自定義輸入或附件視圖的Interface Builder文檔中盒音,選擇View對象表鳍。 在Identity檢查器中,將對象的類設(shè)置為UIView子類祥诽。

2. Playing Input Clicks - 進行輸入播放點擊

要在自定義輸入或鍵盤附件視圖中點擊按鍵譬圣,請首先確保視圖采用UIInputViewAudioFeedback協(xié)議,如Adopting the UIInputViewAudioFeedback Protocol中所述雄坪。 然后厘熟,對于要為其提供單擊聲音的每個tap,請調(diào)用UIDevice類的playInputClick方法,如下所示:

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

系統(tǒng)自動管理音頻會話以進行自定義輸入點擊绳姨,包括根據(jù)需要進行audio ducking登澜。 (有關(guān)音頻會話的信息,請參閱Audio Session Programming Guide飘庄。)

后記

本篇主要講述了輸入數(shù)據(jù)的自定義視圖脑蠕,感興趣的給個贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跪削,隨后出現(xiàn)的幾起案子谴仙,更是在濱河造成了極大的恐慌,老刑警劉巖碾盐,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晃跺,死亡現(xiàn)場離奇詭異,居然都是意外死亡毫玖,警方通過查閱死者的電腦和手機掀虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來付枫,“玉大人涩盾,你說我怎么就攤上這事±常” “怎么了春霍?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叶眉。 經(jīng)常有香客問我址儒,道長,這世上最難降的妖魔是什么衅疙? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任莲趣,我火速辦了婚禮,結(jié)果婚禮上饱溢,老公的妹妹穿的比我還像新娘喧伞。我一直安慰自己,他們只是感情好绩郎,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布莲组。 她就那樣靜靜地躺著外里,像睡著了一般蚤假。 火紅的嫁衣襯著肌膚如雪勘纯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天状植,我揣著相機與錄音浊竟,去河邊找鬼怨喘。 笑死,一個胖子當(dāng)著我的面吹牛振定,可吹牛的內(nèi)容都是我干的必怜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼后频,長吁一口氣:“原來是場噩夢啊……” “哼梳庆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徘郭,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤靠益,失蹤者是張志新(化名)和其女友劉穎丧肴,沒想到半個月后残揉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡芋浮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年抱环,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸巷。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡镇草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤旨,到底是詐尸還是另有隱情梯啤,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布存哲,位于F島的核電站因宇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟偷。R本人自食惡果不足惜察滑,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望修肠。 院中可真熱鬧贺辰,春花似錦、人聲如沸嵌施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吗伤。三九已至滓侍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牲芋,已是汗流浹背撩笆。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工捺球, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夕冲。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓氮兵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歹鱼。 傳聞我的和親對象是個殘疾皇子泣栈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容