iPhone应用程序编程指南(文本和Web)
關(guān)于文本和Web的支持
文本視圖
UIKit框架提供三個(gè)顯示文本內(nèi)容的基本類:
-
UILabel?顯示靜態(tài)文本字符串
-
UITextField?顯示單行可編輯文本
-
UITextView?顯示多行可編輯文本
雖然標(biāo)簽和文本編輯框通常用于顯示相對(duì)少量的文本,但實(shí)際上這些類可以顯示任意數(shù)量的文本。
在使用可編輯的文本視圖時(shí),您必須提供一個(gè)委托對(duì)象,負(fù)責(zé)管理編輯會(huì)話。文本視圖會(huì)向委托對(duì)象發(fā)送幾個(gè)不同的通告,讓它知道編輯何時(shí)開始,何時(shí)結(jié)束,并使它有機(jī)會(huì)重載某些編輯動(dòng)作。
Web視圖
除了顯示內(nèi)容,您還可以用web視圖對(duì)象來顯示web表單,收集用戶輸入。和UIKit的其它文本類相似,如果您在web頁面的表單中有可編輯的文本框,則輕觸該文本框就會(huì)彈出鍵盤,用戶可以通過鍵盤輸入文本。這是web瀏覽整體體驗(yàn)的一部分,web視圖會(huì)自行管理鍵盤的顯示和消除。
web視圖通過其關(guān)聯(lián)的委托對(duì)象提供有關(guān)網(wǎng)頁何時(shí)被裝載、及裝載過程是否發(fā)生錯(cuò)誤的信息。web委托是指實(shí)現(xiàn)一個(gè)或多個(gè)UIWebViewDelegate協(xié)議方法的對(duì)象。您可以通過實(shí)現(xiàn)委托方法來響應(yīng)裝載錯(cuò)誤或處理一些與裝載有關(guān)的其它任務(wù)。
鍵盤和輸入法
每當(dāng)用戶觸擊一個(gè)可以接受文本輸入的對(duì)象時(shí),該對(duì)象就會(huì)請(qǐng)求系統(tǒng)顯示一個(gè)合適的鍵盤。根據(jù)用戶程序的需要和偏好的語言,系統(tǒng)可以顯示幾種不同的鍵盤。您的應(yīng)用程序雖然不能控制用戶的偏好語言(因此也不能控制鍵盤的輸入法),但可以控制鍵盤的使用屬性,比如特殊鍵的配置及其行為。
您可以直接通過應(yīng)用程序中的文本對(duì)象來配置鍵盤的屬性。UITextField和UITextView類都遵循UITextInputTraits協(xié)議,該協(xié)議定義了一些配置鍵盤的屬性。在程序或Interface Builder的查看器窗口中設(shè)置這些屬性就可以使系統(tǒng)顯示指定類型的鍵盤。
請(qǐng)注意:雖然UIWebView類并不直接支持UITextInputTraits協(xié)議,但您還是可以配置文本輸入元素的一些鍵盤屬性。特別值得一提的是,您可以在輸入元素的定義中包含autocorrect和autocapitalization屬性,通過這些屬性來指定鍵盤的行為,如下面的例子所示:
| <input type="text" size="30" autocorrect="off" autocapitalization="on"> |
?
管理鍵盤
接收鍵盤通告
當(dāng)鍵盤被顯示或隱藏的時(shí)候,iPhone OS會(huì)向所有經(jīng)過注冊(cè)的觀察者對(duì)象發(fā)出如下通告:
-
UIKeyboardWillShowNotification
-
UIKeyboardDidShowNotification
-
UIKeyboardWillHideNotification
-
UIKeyboardDidHideNotification
當(dāng)鍵盤首次出現(xiàn)或者消失,以及鍵盤的所有者或應(yīng)用程序的方向發(fā)生變化的任何時(shí)候,系統(tǒng)都會(huì)發(fā)出鍵盤通告。
在上述的各種情況下,系統(tǒng)只發(fā)送與具體場(chǎng)景相關(guān)的的消息集合。舉例來說,如果鍵盤的所有者發(fā)生變化,系統(tǒng)只向當(dāng)前的擁有者發(fā)送UIKeyboardWillHideNotification消息,但不發(fā)送UIKeyboardDidHideNotification消息,因?yàn)檫@個(gè)變化不會(huì)導(dǎo)致鍵盤最終被隱藏。UIKeyboardWillHideNotification消息只是簡(jiǎn)單地通知鍵盤當(dāng)前的所有者即將失去鍵盤焦點(diǎn)。而改變鍵盤的方向則會(huì)使系統(tǒng)發(fā)出上述的兩種消息,因?yàn)槊總€(gè)方向的鍵盤是不同的,在顯示新的鍵盤之前,必須先隱藏原來的鍵盤。
每個(gè)鍵盤通告都包含鍵盤在屏幕上的位置和尺寸。您應(yīng)該使用通告中的信息來確定鍵盤的尺寸和位置,而不是假定鍵盤具有某個(gè)特定的尺寸或處于某個(gè)特定的位置。
圖5-5??在肖像模式和景觀模式下的相對(duì)鍵盤尺寸
請(qǐng)注意:info字典中的UIKeyboardBoundsUserInfoKey鍵包含的矩形只能用于取得尺寸信息,不要將該矩形的原點(diǎn)(它的值總是為{0.0, 0.0})用于矩形計(jì)算。由于鍵盤是以動(dòng)畫的形式出現(xiàn)在它的位置上的,其實(shí)際的邊界尺寸會(huì)隨著時(shí)間的不同而不同,因此,info字典中有UIKeyboardCenterBeginUserInfoKey和UIKeyboardCenterEndUserInfoKey兩個(gè)鍵,用于保存鍵盤的起始和終止的位置,您可以根據(jù)這些位置計(jì)算出鍵盤的原點(diǎn)。
使用鍵盤通告的一個(gè)原因是為了重新定位被鍵盤遮掩的內(nèi)容。
顯示鍵盤
當(dāng)用戶觸擊一個(gè)視圖時(shí),系統(tǒng)就會(huì)自動(dòng)將該視圖作為第一響應(yīng)者。而當(dāng)這種場(chǎng)景發(fā)生在包含可編輯文本的視圖時(shí),該視圖就會(huì)啟動(dòng)一個(gè)文本編輯會(huì)話。如果當(dāng)前鍵盤不可見,該視圖會(huì)在編輯會(huì)話剛開始時(shí)請(qǐng)求系統(tǒng)顯示鍵盤。如果鍵盤已經(jīng)顯示在屏幕上了,第一響應(yīng)者的改變會(huì)導(dǎo)致來自鍵盤的文本輸入被重定向到用戶剛剛觸擊的視圖上。
鍵盤是在視圖變?yōu)榈谝豁憫?yīng)者時(shí)自動(dòng)被顯示的,因此,您通常不需要為了顯示它而做什么工作。但是,您可以通過調(diào)用視圖對(duì)象的becomeFirstResponder方法來為可編輯的文本視圖顯示鍵盤。調(diào)用這個(gè)方法可以使目標(biāo)視圖成為第一響應(yīng)者,并開始編輯過程,其效果和用戶觸擊該視圖是一樣的。
如果您的應(yīng)用程序在一個(gè)屏幕上管理幾個(gè)基于文本的視圖,則需要跟蹤當(dāng)前哪個(gè)視圖是第一響應(yīng)者,以便在需要的時(shí)候取消鍵盤的顯示。
取消鍵盤
雖然鍵盤通常是自動(dòng)顯示的,但它并不自動(dòng)取消。相反,您的應(yīng)用程序需要在恰當(dāng)?shù)臅r(shí)機(jī)取消鍵盤。通常情況下,您在響應(yīng)用戶動(dòng)作的時(shí)候進(jìn)行這樣的操作,比如當(dāng)用戶觸擊鍵盤上的Return或Done按鍵、或者觸擊應(yīng)用程序界面上的其它按鍵時(shí)。根據(jù)鍵盤配置的不同,您可能需要在用戶界面上加入額外的控件來取消鍵盤。
您可以調(diào)用作為當(dāng)前第一響應(yīng)者的文本視圖的resignFirstResponder方法來取消鍵盤。當(dāng)文本視圖失去第一響應(yīng)者的狀態(tài)時(shí),就會(huì)結(jié)束其當(dāng)前的編輯會(huì)話,將這個(gè)變化通知它的委托對(duì)象,并取消鍵盤。
移動(dòng)鍵盤下面的內(nèi)容
需要做的調(diào)整通常包括暫時(shí)調(diào)整一或多個(gè)視圖的尺寸和位置,從而使文本對(duì)象可見。管理帶有鍵盤的文本對(duì)象的最簡(jiǎn)單方法是將它們嵌入到一個(gè)UIScrollView(或其子類,如UITableView)對(duì)象。當(dāng)鍵盤被顯示出來時(shí),您需要做的只是調(diào)整滾動(dòng)視圖的尺寸,并將目標(biāo)文本對(duì)象滾動(dòng)到合適的位置。為此,在UIKeyboardDidShowNotification通告的處理代碼中需要進(jìn)行如下操作:
取得鍵盤的尺寸。
將滾動(dòng)視圖的高度減去鍵盤的高度。
將目標(biāo)文本框滾動(dòng)到視圖中。
圖5-6演示了一個(gè)簡(jiǎn)單的應(yīng)用程序如何處理上述的幾個(gè)步驟。
該程序?qū)讉€(gè)文本輸入框嵌入到UIScrollView對(duì)象中,當(dāng)鍵盤出現(xiàn)時(shí),通告處理代碼首先調(diào)整滾動(dòng)視圖的尺寸,然后用UIScrollView類的scrollRectToVisible:animated:方法將被觸擊的文本框滾動(dòng)到視圖中。
圖5-6??調(diào)整內(nèi)容的位置,使其適應(yīng)鍵盤
請(qǐng)注意:在配置滾動(dòng)視圖時(shí),請(qǐng)務(wù)必為所有的內(nèi)容視圖配置恰當(dāng)?shù)淖詣?dòng)尺寸調(diào)整規(guī)則。在之前的圖中,文本框?qū)嶋H上是一個(gè)UIView對(duì)象的子視圖,該UIView對(duì)象又是UIScrollView對(duì)象的子視圖。如果該UIView對(duì)象的UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleHeight選項(xiàng)被設(shè)置了,則改變滾動(dòng)視圖的邊框尺寸會(huì)同時(shí)改變它的邊框,因而可能導(dǎo)致不可預(yù)料的結(jié)果。禁用這些選項(xiàng)可以確保該視圖保持尺寸不變,并正確滾動(dòng)。描畫文本
除了顯示和編輯文本的UIKit類之外,iPhone OS還包含幾個(gè)直接在屏幕上描畫文本的方法。描畫簡(jiǎn)單字符串的最簡(jiǎn)單有效的方法是使用NSString類的UIKit擴(kuò)展,該擴(kuò)展包含一些在屏幕上描畫字符串的方法,并且可以描畫時(shí)使用多種屬性。還有一些方法,可以在真正描畫之前計(jì)算渲染字符串所需要的尺寸,這些方法有助于更加精確布局應(yīng)用程序的內(nèi)容。
重要提示:由于性能上的考慮,您應(yīng)該盡可能避免直接描畫文本。對(duì)于靜態(tài)文本,通過一或多個(gè)UILabel對(duì)象進(jìn)行描畫比使用定制描畫例程要高效得多。類似地,UITextField類也支持不同的風(fēng)格,這些風(fēng)格使您更加易于將可編輯的文本區(qū)域集成到您的內(nèi)容中。
?
當(dāng)您需要在界面上描畫定制文本字符串時(shí),請(qǐng)使用NSString方法。UIKit包含一些對(duì)基本NSString類的擴(kuò)展,用于在視圖中描畫字符串。這些方法使您可以精確調(diào)整文本的位置,以及將文本和視圖內(nèi)容進(jìn)行融合;這個(gè)類的方法還可以根據(jù)指定的字體和風(fēng)格屬性計(jì)算文本的包圍矩形。更多信息請(qǐng)參見NSString UIKit擴(kuò)展參考。
如果您需要對(duì)描畫過程中用到的字體有更多的控制,還可以使用Core Graphics框架中的函數(shù)來進(jìn)行描畫。Core Graphics框架提供的方法可以對(duì)字形和文本進(jìn)行精確描畫和定位。有關(guān)這些函數(shù)及其用法的更多信息,請(qǐng)參見Quartz 2D編程指南和Core Graphics框架參考。
在Web視圖中顯示內(nèi)容
對(duì)于本地的內(nèi)容,您可以動(dòng)態(tài)創(chuàng)建,也可以使用文件,然后調(diào)用loadData:MIMEType:textEncodingName:baseURL:或loadHTMLString:baseURL:方法;
如果要從網(wǎng)絡(luò)加載,則需要?jiǎng)?chuàng)建一個(gè)NSURLRequest對(duì)象,然后傳遞給web視圖對(duì)象的loadRequest:方法。
在發(fā)起一個(gè)基于網(wǎng)絡(luò)的請(qǐng)求后,如果由于某種原因必須釋放web視圖,則必須在釋放之前取消待處理的請(qǐng)求。為此,您可以調(diào)用web視圖的stopLoading方法。通常情況下,您可以在web視圖的視圖控制器的viewWillDisappear:方法中執(zhí)行這些代碼。如果需要確定一個(gè)請(qǐng)求是否處于等待狀態(tài),可以通過web視圖的loading屬性來判斷。
轉(zhuǎn)載于:https://www.cnblogs.com/Piosa/archive/2012/02/14/2350260.html
總結(jié)
以上是生活随笔為你收集整理的iPhone应用程序编程指南(文本和Web)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欢迎访问我的新浪博客
- 下一篇: Direct2D (13) : 画刷之