UITextField的使用、介紹、講解、全解、簡介、說明

 【2018年中秋節良心寫做】文章將盡量的全面介紹UITextField的全部相關知識,邏輯連貫,須要認真理解,一鼓作氣。編程


 關鍵詞:併發

屏幕鍵盤(onscreen keyboard)、鍵盤自定義、鍵盤類型、規範輸入源、目標動做機制(terget-action)、委託(delegate)、控件、覆蓋視圖、內建、targets和actions框架


 UITextField類ide

這是一個在界面中顯示可編輯文本區域的對象。工具


 1、歸納

使用UITextField這個對象,能夠收集用戶在使用屏幕鍵盤【】過程當中基於文本的輸入信息。意思就是,若是你想讓用戶使用屏幕鍵盤輸入信息,那麼就可使用UITextField這個對象來獲悉用戶在鍵盤上輸入了些什麼內容。屏幕鍵盤的樣式能夠配置成不一樣的輸入類型【】來規範輸入,以適應不一樣的輸入場景。好比,輸入純文本、輸入電子郵件地址、輸入數字等等場景。所以,配置好鍵盤的類型,能夠做爲規範輸入源【】的一種手段。在輸入手機號碼的文本輸入框,則使用數字鍵盤能夠更加省事,避免用戶輸入不合理的文本。UITextField對象被配置成與系統的屏幕鍵盤綁定的,即當用戶點擊UITextField對象時,UITextField就被激活,屏幕鍵盤就會自動被調用起來(從屏幕底部彈出在用戶面前,方便用戶接下來的輸入操做)。固然,剛剛說了是默認配置,也就是說,UITextField也可使用其餘非系統的屏幕鍵盤,這裏涉及到的是鍵盤自定義【】方面的知識。UITextField對象使用目標動做機制【】和委託模式【】讓開發者知道UITextField的全部事件。佈局

UITextField對象除了基本的文本編輯功能以外,開發者也能夠往UITextField對象上面添加視圖,以用來展現其餘的一些附加信息,或者添加一些可點擊控件【】提供給用戶作一些附加的操做。開發者能夠將自定義的覆蓋視圖【】添加在UITextField對象中的各個元素上,好比書籤按鈕、搜索圖標等元素上。UITextField自身依靠這個設計,蘋果開發工程師放置了一個內建【】的覆蓋視圖在UITextField上,用它來提供「清空當前文本內容」的功能。固然,雖然是蘋果開發工程師爲UITextField設計的,開發者也是能夠選擇使用或者不使用這個內建的清除功能按鈕(以下圖)的。字體

當建立好一個UITextField對象並將它添加到界面上以後,開發者須要對這個UITextField對象進行一番配置。配置任務涉及到下面的所有或者部分:動畫

一、爲UITextField對象配置一個或多個targets和actions【】。ui

二、以前說到的UITextField默認使用系統鍵盤,也可使用非系統鍵盤,可是無論使用哪一種,請爲該UITextField對象配置好這個鍵盤的相關屬性。atom

三、除了對UITextField的作一些基本的配置以外,因爲該控件涉及到一些複雜的用戶交互,所以這些交互的處理等事情應該交給delegate來作。所以,請爲UITextField分配好委託對象來處理重要任務。好比:(這一塊內容,須要用過UITextFieldDelegate作詳細的瞭解)

  • 肯定是否容許用戶編輯UITextField中的內容
  • 驗證用戶輸入的內容
  • 響應鍵盤中Return按鈕
  • 將用戶輸入的內容顯示在其餘控件上

四、將建立的這個UITextField對象被一個控制器對象引用。

2、關於顯示和隱藏鍵盤

當一個UITextField對象成爲第一響應者【】的時候,iOS系統會自動的展現出鍵盤而且將用戶在鍵盤上的輸入和這個UITextField對象綁定在一塊兒。這就是爲何,當用戶點擊一個UITextField對象,鍵盤彈出後,用戶在鍵盤上的輸入能夠直接顯示在這個UITextFiled上面,而這一整個過程,開發者不須要作額外的關心,只須要將UITextField對象建立出來,作好上面提到的基本配置,而後添加在界面上就能完成。那麼UITextField如何才能成爲第一響應者呢?當用戶點擊界面上的UITextField對象的時候,這個UITextField對象就會自動的成爲第一響應者。開發這也可使用代碼讓一個UITextField對象強制成爲第一響應者,調用這個UITextField的實例方法-becomeFirstResponder便可。通常是在須要用戶輸入一些信息的時候,開發者讓UITextField對象強制成爲第一響應者。

提示:

鍵盤的出現有可能掩蓋界面的某些部分。開發者須要更新界面,以確保正在編輯的UITextField是可見的。監聽鍵盤的通知【】來檢測到鍵盤的出現和消失,並對界面進行一些必要的更改。

相反的,開發者也可使用代碼讓UITextField對象強制放棄第一響應者,這樣系統就可讓鍵盤隱藏。什麼狀況下,開發者會這樣作呢?好比當用戶點擊鍵盤的Return按鈕的時候,開發者須要監聽用戶的這種操做,當用戶點擊鍵盤的Return後,開發者有可能須要讓UITextField對象放棄第一響應者。iOS系統也會作自動收起鍵盤的操做,好比,當用戶點擊不支持鍵盤輸入的其餘控件的時候,iOS系統會自動的讓當前的UITextField控件放棄第一響應者,隱藏(收起)鍵盤。

稍微總結下:

上面的內容要注意下順序邏輯,當UITextField成爲第一響應者的時候,iOS系統會自動的彈出鍵盤;當UITextField放棄第一響應者的時候,iOS系統會自動的收起鍵盤。也就是說,成爲第一響應者和彈出鍵盤,放棄第一響應者和收起鍵盤,是同時存在的,不會出現UITextField成爲第一響應者,可是鍵盤不彈出等相似的狀況。

而後,如何讓UITextField成爲第一響應者或者放棄第一響應者呢?能夠經過用戶觸發某些事件後,iOS自動的響應,也能夠由開發者用代碼強制實現。

 UITextField既然有編輯功能,iOS用編輯狀態【】來表示UITextField的編輯過程當中的各類狀態。鍵盤的出現和消失是會影響到UITextField的編輯狀態的,而且是自動的。好比當UITextField對象成爲第一響應者的時候,鍵盤自動彈出,UITextField進入編輯狀態,而且會像UITextField的委託代理髮送對應的通知【】。

3、配置鍵盤的外表

開發者可使用UITextField的UITextInputTraits協議中定義的一些屬性來自定義鍵盤。UIKit框架提供了支持用戶當前語言的標準化鍵盤,還支持用於輸入數字、URL、電子郵件地址和其餘特定類型信息的專用鍵盤。開發者可使用該協議的屬性來調整鍵盤的特性,這裏所說的特性好比是:

  • 鍵盤展現的樣式
  • 鍵盤的自組織行爲
  • 鍵盤的自校訂行爲
  • 鍵盤上Return鍵的顯示

4、響應與鍵盤相關的通知

剛剛在上面的第二點也進行了說明,鍵盤的彈出和收起是由iOS系統管理控制的,鍵盤的展現和隱藏跟隨的是第一響應者的變化。爲了讓開發這能把控鍵盤的相關事件,iOS系統會發布與鍵盤相關的通知,開發者應該認真收聽這類通知,而且作好項目中的把控。這類通知包括:

  • UIKeyboardWillShowNotification
  • UIKeyboardDidShowNotification
  • UIKeyboardWillHideNotification
  • UIKeyboardDidHideNotification
  • UIKeyboardWillChangeFrameNotification
  • UIKeyboardDidChangeFrameNotification

在每一個通知對象中都包含一個userInfo的字典對象,裏面包含了鍵盤的大小(size)信息。由於鍵盤能夠遮蓋住界面,所以開發者應該好好的利用這個size信息從新佈局屏幕上的內容。通常能夠分兩種狀況,對於嵌入在滾動視圖(ScrollView或其子類)中的內容,能夠將用戶正在使用的UITextField對象滾動到鍵盤之上以免被遮住。對於其餘狀況,那就調整底部視圖(view對象)的位置,以免其被鍵盤覆蓋。

5、格式化UITextField中的文本內容

UITextField提供了兩種方式供開發者使用,來設置UITextField中的文本格式:

  • 首先開發者可使用UITextField的相關屬性來控制文本格式,好比字體(font)、顏色(color)、樣式(style)。或者也能夠利用NSAttributedString類爲UITextField對象設置富文本字符串。
  • 而後開發者也可使用NSFormatter對象設置UITextField對象中文本格式。

像font、textColor和textAlignment這些屬性,影響的是UITextField對象中文本的外表樣式。而且做用的對象是整個文本字符串。好比開發者指定textColor爲紅色,那麼UITextField對象中整個字符串的字體顏色都是紅色。若是,開發者須要對TextField中的文本進行更加細膩化、或者說是局部效果的化,就須要使用NSAttributedString對象。

上面提到的NSFormatter對象,其實UITextField對象並無提供這方面的原生支持【】。可是,開發者可使用UITextField的delegate來完成實時格式化字符串操做。好比使用-textField:shouldChangeCharactersInRange:replacementString:協議方法,在用戶輸入過程當中驗證和作格式化操做。好比,UITextField中的文本字體顏色默認是黑色,當檢測到用戶輸入數字文本時,把數字的字符顏色格式化爲紅色,起到提示做用等等場景。

6、使用覆蓋視圖(Overlay View)來編輯UITextField中的文本內容

首先須要明白的是,UITextField這個控件的內置結構,覆蓋視圖是UITextField對象的可編輯區域【】外左側和外右側顯示的小視圖。若是開發者不配置覆蓋視圖,可編輯區域將會佔用覆蓋視圖的區域,一併歸入可編輯區域範圍。開發者若是要使用覆蓋視圖,方法很簡單。將一個按鈕設置爲UITextField對象的覆蓋視圖就行,這個按鈕通常是基於image的按鈕,好比一個書籤icon。爲這個按鈕配置好target和action以響應用戶的點擊事件。下面的代碼就是爲UItextField設置左邊的覆蓋視圖:

UIButton* overlayButton = [UIButton buttonWithType:UIButtonTypeCustom];
[overlayButton setImage:[UIImage imageNamed:@"bookmark"] forState:UIControlStateNormal];
[overlayButton addTarget:self action:@selector(displayBookmarks:)
        forControlEvents:UIControlEventTouchUpInside];
overlayButton = CGRectMake(0, 0, 28, 28);
 
// Assign the overlay button to a stored text field
self.textField.leftView = overlayButton;
self.textField.leftViewMode = UITextFieldViewModeAlways;

UITextField對象自身也內建(build-in)了一個覆蓋視圖在右邊覆蓋視圖的位置上,是一個清除按鈕,這個清除按鈕可讓用戶很方便的刪除UITextField中的全部文本內容。開發者也能夠自定義右邊的覆蓋視圖,使用好rightViewMode屬性和claerButtonMode來肯定好應該什麼時候應該顯示自定義的覆蓋視圖,什麼時候顯示清除按鈕。好比,開發者監聽若是用戶尚未輸入任何文本的時候,右邊的覆蓋視圖顯示自定義的複製功能的按鈕,若是已經有文本內容,就讓自定義的按鈕消失,顯示的是內建的清除功能的按鈕等等情景。

7、驗證文本和管理編輯過程

UITextField是在其delegate的幫助下管理其文本的編輯過程。當用戶在與一個UITextField對象進行交互時,UITextField對象會通知它的delegate,而且可讓delegate控制正在發生的事情。有一點尤爲要注意,UITextField容許它的delegate控制正在發生的事,正在發生的事。不是發生之後在通知delegate,而是可以直接扭轉,在發生時扭轉。說得神乎其神,其實就是在用戶-敲擊鍵盤-顯示在UITextField前,通知了delegate而已。用戶與UITextField之間的交互大體能夠分爲三個階段,用戶點擊UITextfield對象,讓UITextField對象啓動編輯;用戶在鍵盤上輸入的過程;用戶退出編輯。這個階段過程,UITextField均可以經過delegate與開發者進行互動,開發者能夠經過delegate來防止用戶啓動或中止編輯過程,或者在鍵入文本時驗證文本。開發者還可使用委託方法【】來執行相關任務,例如將用戶鍵入的文本顯示在界面的其餘視圖上等等場景。

8、UITextField接口文件解讀

(1)驗證和處理編輯

@property(nonatomic, weak) id<UITextFieldDelegate> delegate;

👆UITextField的代理會響應編輯相關的事件。UITextFieldDelegate包含了一系列可選的方法。我反覆強調過,編程這件事上,關心順序很重要!在下面要介紹的協議方法中,我會盡力的把順序理清楚。

UITextField在與用戶交互這個過程當中,會把一些重要的changes(能夠理解爲動靜)經過delegate發佈出來。當UITextField成爲第一響應者並彈出鍵盤(或者是指定的其餘inputView)以前,UITextField就已經開始編輯狀態了。

一、當UITextField成爲第一響應者前,UITextField對象會調用代理的下面方法:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField;

經過上面的這個代理方法,UITextField肯定是否容許用戶接下來的鍵入操做。若是返回YES,則該UITextField對象成爲第一響應者,iOS系統自動將鍵盤彈出。若是返回NO,則至關於用戶沒有點擊該UITextField對象,不會有接下來的事發生。若是開發者沒有實現這個方法,UITextField對象就默認爲返回了YES。

二、接下來UITextField對象成爲第一響應者,而後iOS系統爲了響應,會彈出鍵盤(或者是UITextField指定的inputView對象),而且會發出UIKeyboardWillShowNotification和UIKeyboardDidShowNotification通知。若是鍵盤(或者是其餘的inputView對象)已經在界面上了,則發出UIKeyboardWillChangeFrameNotification和UIKeyboardDidChangeFrameNotification通知來替代。

三、在接下來,這個UITextField對象會調用代理的下面方法,併發送UITextFieldTextDidBegineditingNotification通知:

- (void)textFieldDidBeginEditing:(UITextField *)textField;

調用這個方法的時候說明,UITextField對象剛剛已經成爲第一響應者。開發者能夠在這個時候更新一些狀態信息或者是執行一些其餘的任務。好比,屬於覆蓋視圖的清除按鈕,就是在編輯時纔可見的。

四、在編輯的過程當中,下面的這個代理方法會反覆被調用:

  • 無論何時,只要UITextField中當前的文本發生了變化,UITextField就會調用代理的以下方法,而且會發出UITextFieldTextDidChangeNotification通知:
- (BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string;
  • 當用戶點擊UITextField內建的清除按鈕的時候,UITextField會調用代理的以下方法:
- (BOOL)textFieldShouldClear:(UITextField *)textField;
  • 當用戶點擊鍵盤上的Return按鈕的時候,UITextField會調用代理的以下方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField;

五、當UITextField對象將要放棄第一響應者的時候,UITextField會調用代理的以下方法:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField;

這個方法就是,當UITextField將要放棄第一響應者前,問一下代理,是否容許UITextField對象放棄第一響應者身份。通常狀況下,當用戶點擊了其餘響應式的控件【】的時候,或者開發者調用UITextField的實例方法-resignFirstResponder方法,都會迫使當前的UITextField對象放棄第一響應者身份。在前面介紹UITextFieldDelegate的時候說過,開發者能夠控制正在發生的事。因此,開發者能夠作到不讓該UITextField對象不放棄第一響應者身份,這是能夠作到的。通常狀況下,都是容許其放棄的。當時也有不容許的情景,好比,開發者能夠在這個協議方法中檢測文本中是否包含了一些無效的內容,若是有的話,阻止用戶切換到另外一個控件,直到用戶更改完文本內容。

若是開發者不實現這個方法,默認返回YES。

最後關於這個協議方法,有一點須要注意的事,這個協議方法僅提供關於編輯是否應該結束的建議。即便返回NO,UIKit框架也有權利迫使編輯結束。好比,當這個UITextField對象從父視圖【】或者是window【】中移除的時候。

六、當UITextField放棄第一響應者後,做爲響應,iOS系統會隱藏或者調整(若是用戶又去點擊另外一個UITextField對象,鍵盤不會收起再彈起,而是會選擇調整,這樣的話,上面也提到過「若是鍵盤(或者是其餘的inputView對象)已經在界面上了,則發出UIKeyboardWillChangeFrameNotification和UIKeyboardDidChangeFrameNotification通知來替代」)。當隱藏鍵盤的時候,iOS系統會發出UIKeyboardWillShowNotification和UIKeyboardDidShowNotification通知。

七、最後UITextField對象會調用協議的下面方法,而且發出UITextfieldTextDidEndEditingNotification通知,標誌着用戶與UITextField的交互結束了:

- (void)textFieldDidEndEditing:(UITextField *)textField;

與前面第3個階段介紹的方法對應,開發者在這個方法中讓清除按鈕隱藏起來。

(2)配置UITextField的相關屬性

一、文本(iOS2.0)

@property(nonatomic, copy) NSString *text;

👆這個屬性默認值是空字符串@""。這個字符串的樣式是根據font、textColor等屬性來修飾的,上面也介紹到了,font這類屬性,修飾的是UTextField文本內容的總體,好比設置font字體爲16號字體,那麼UITextField文本字符串的字體都是16號字體。若是開發者想對這組文本內容進行區分對待,區分的進行樣式化,那麼就要使用下面這個屬性attributedText。

 

二、富文本(iOS6.0)

@property(nonatomic, copy) NSAttributedString *attributedText;

👆在剛剛介紹text這個屬性的時候就已經引薦過這個屬性了,這個屬性稱之爲富文本屬性,顧名思義就是這個文本不只一個字符串屬性,裏面還能夠安插各類修飾屬性。開發者在平時工做中,文本展現的事情仍是挺多的,因此在下意淫做者強烈推薦好好掌握它。在接下來舉例它如何使用以前,有一點須要重點說明下,就是若是對於UITextField對象同時設置了text和attributedText兩個屬性,那麼UITextField展現的內容以attribuedText優先,可是若是對text屬性再一次賦予一個新的值,那麼這個新的值也一樣影響到attribuedText。如今開始介紹上面這個屬性在平時工做中的使用:

 

三、佔位字符串(iOS2.0)

@property(nonatomic, copy) NSString *placeholder;

👆這個屬性是UITextField對象中內建的(原生提供),像UITextView就沒有原生提供這個屬性。這個屬性值默認是nil,開發者設置這個屬性,可讓UITextField文本內容爲空字符串的時候,將佔位字符串的內容展現出來,起到一個提示用戶輸入內容的做用。這個佔位字符串的繪製屬性中的字體顏色使用的是系統默認的顏色,字體大小使用的font屬性,跟text共享一個font屬性值。

 

四、富文本佔位字符串(iOS6.0)

@property(nonatomic, copy) NSAttributedString *attributedPlaceholder;

👆這個屬性是在iOS6出現的,placeholder屬性是在iOS2出現的。其實能夠猜到這個屬性其實就是上面屬性的一個補充。就像text屬性在iOS2.0出現,富文本屬性attributedText在iOS6.0出現,也是起到一個補充的做用。

 

五、默認的富文本樣式(iOS7.0)

@property(nonatomic, copy) NSDictionary<NSAttributedStringKey, id> *defaultTextAttributes;

👆能夠直接對UITextField對象的attributedText屬性賦值,可是在初始化attributedText對象時須要字符串參數。那麼若是才能像使用font屬性同樣,先設置好富文本的樣式屬性,等到後面用戶輸入文本的時候按照事先設置好的富文本樣式進行渲染呢,那麼就是這個屬性了。

 

六、字體(iOS2.0)

@property(nonatomic, strong) UIFont *font;

👆這個屬性做用的是整個文本信息的樣式。若是開發者不設置這個屬性,那麼UITextField默認使用系統字體的粗文本樣式。尤爲一點須要注意的是,這個屬性不只做用在了text這個屬性上,上面提升的佔位字符串的字體大小使用的也是這個字體號。

 

七、文本顏色(iOS2.0)

@property(nonatomic, strong) UIColor *textColor;

 👆這個屬性做用的也是整個文本信息的樣式,設置文本字體的顏色。該屬性的默認值是黑色,該屬性值不能設置爲nil,否則會引起異常。

 

八、文本對齊方式(iOS2.0)

@property(nonatomic) NSTextAlignment textAlignment;

 👆用過word的都應該知道吧,文本對齊方式。這個屬性做用在text和placehoder二者上,而且做用是總體屬性,所以若是開發者想區分處理樣式,請使用好富文本屬性。這個屬性默認是左對齊。

 

九、當前光標的富文本樣式(iOS6.0)

@property(nonatomic, copy) NSDictionary<NSAttributedStringKey, id> *typingAttributes;

👆這個屬性的使用是有前提的,首先UITextField的allowsEditingTextAttributeds是YES,即容許用戶編輯富文本信息,而且還不要設置默認的富文本樣式屬性的前提下。用戶從某一處複製了(紅色字體、16font)的富文本字符串到該UITextField中,接下來用戶本身經過鍵盤輸入文本時,使用的依然是前面的富文本樣式(紅色字體、16font)。使用過word的應該已經想到這個情景了。這個就是如今要介紹的typingAttribueds屬性。

 

(3)調整UITextField中文本的大小

一、是否根據UITextField中文本區域的大小自動調整font(iOS2.0)

@property(nonatomic) BOOL adjustsFontSizeToFitWidth;

👆這個屬性通常是怎麼使用的呢?首先一般,UITextField中文本字體會根據font屬性進行繪製。若是這個屬性設置爲YES,那麼當UITextField根據font繪製出來的文本內容會超過UITextField中的文本編輯邊界矩形,那麼UITextField會開始減少字體的大小,直到字符串可以在文本編輯邊界矩形中放置得下或者直到達到最小字體爲止。另外文本是沿着基線(baseline)【】縮小的。這個屬性默認值爲NO,若是設置這個屬性爲YES,那麼還應該結合minimumFontSize(最小字體號)一塊兒使用。

 

二、自動調整的最小字體

@property(nonatomic) CGFloat minimumFontSize;

👆這個屬性的默認值是0.0,所以若是開發者使用adjustsFontSizeToFitWidth屬性,就應該要對這個屬性進行賦值。另外須要注意的是,在iOS6.0+使用富文本的話,設置最小字體這個屬性,會致使整個富文本都使用這個最小化字體。

 

(4)管理UITextField對象的編輯行爲

一、反應當前是否處於編輯狀態(iOS2.0)

@property(nonatomic, readonly, getter=isEditing) BOOL editing;

👆這個屬性是隻讀,當UITextField對象開始進入編輯狀態是,這個值就是YES。當UITextField結束編輯狀態時,這個值就是NO。正如上面所說的,這些過程,UITextField會經過delegate或者是通知都會讓開發者獲知的。

 

二、是否在開始編輯時清除掉以前文本內容(iOS2.0)

@property(nonatomic) BOOL clearsOnBeginEditing;

👆若是這個屬性設置爲YES,那麼當用戶點擊UITextField對象,讓其進入編輯狀態的時候,UITextField中以前的老的文本信心所有會被清除掉。

 

三、是否在對UITextField插入內容時清除掉以前的文本內容(iOS6.0)

@property(nonatomic) BOOL clearsOnInsertion;

👆若是不能讓用戶長按密碼UITextField框複製密碼,而且當用戶輸入的密碼驗證錯誤後,想接着後面輸入時,直接就把原來的文本內容所有刪除掉。那麼,開發者只須要將這個屬性值設置爲YES就能夠了。注意,這樣的話,用戶就不能對UITextField框長按顯示出長按菜單UI【】。

 

四、是否容許用戶編輯富文本(iOS6.0)

@property(nonatomic) BOOL allowsEditingTextAttributes;

👆 若是這個屬性之設置爲YES,則用戶能夠編輯富文本信息。而且,用戶能夠經過複製粘貼的方式,將其餘地方的富文本信息直接複製進UITextField的編輯區域,UITextField對象會保留這些樣式並顯示出來。若是設置爲NO,那麼用戶就從其餘地方複製的富文本,UITextField不會認可。固然,這個屬性就算爲NO,是不會影響到開發者用代碼設置富文本信息的。這個屬性默認值爲NO。

 

(5)設置UITextField的背景外觀

一、樣式類型(iOS2.0)

@property(nonatomic) UITextBorderStyle borderStyle;

👆這個屬性的默認值是UITextBorderStyleNone。若是設置屬性值爲UITextFieldBorderStyleRoundedRect,那麼backgound(背景圖)這個屬性就會失效。UITextField自己提供了一些經常使用的樣式,方便開發者直接使用。

 

二、正常背景圖(iOS2.0)

@property(nonatomic, strong) UIImage *background;

👆當UITextField對象在enabled(可以使用狀態)【】時,顯示出來的背景圖片。 這個屬性值默認爲nil。當開發者設置這個屬性,就意味着不用borderstyle屬性中的樣式了,固然上面提到了,若是那個屬性值爲UITextFieldBorderStyleRoundedRect那就是的該屬性無效。這個背景圖片會繪製在UITextField的底層,就像全部的背景圖片同樣,要面臨着被拉伸的狀況,所以提供的圖片應該要可以適應拉伸,或者說,作好被拉伸的準備。通常工做中,這種圖片通常都是線框背景圖,圖片中部不要有繪製的圖像,這樣在開發中,開發者可使用將圖片中間拉伸,保證邊緣不變形的方式提供圖片給該屬性。

 

三、不可用狀態背景圖(iOS2.0)

@property(nonatomic, strong) UIImage *disabledBackground;

👆這個屬性須要跟上面提到的background(背景圖)屬性配套使用。若是background屬性不設置,那麼單獨設置這個屬性視爲無效。顧名思義,這個背景圖指的是當UITextField處於disabled狀態時的背景圖。

 

(6)管理UITextField的覆蓋視圖

一、標準的清除按鈕出現時機(iOS2.0)

@property(nonatomic) UITextFieldViewMode clearButtonMode;

 👆UITextField對象有一個內建的清除按鈕放置在編輯區域的右邊。這個按鈕可讓用戶可以快速的清除掉文本內容。可是這個按鈕出現的時機,經過這個屬性讓開發者決定。這個屬性的默認值是UITextFieldViewModeNever(從不出現),可是通常的需求時當UITextField處於編輯狀態時,用戶就須要這個按鈕的存在,所以這個屬性通常設置成UITextFieldViewModeWhileEditing。

 

二、左覆蓋圖(iOS2.0)

@property(nonatomic, strong) UIView *leftView;

👆可使用左覆蓋視圖來指示這個UITextField對象的做用。好比,將一個放大鏡的圖片做爲左覆蓋視圖,以用來提示用戶這個UITextField對象是用來搜索的。另外,以前介紹的textAlignment屬性設置UITextField的文本內容的對齊方式,也能夠設置從左到右仍是從右到左的書寫習慣,這個屬性,開發者只須要放置用戶從左到右書寫習慣的圖標朝向,若是UITextField的書寫習慣變成從右到左的話,iOS系統會自動的把這個圖像的朝向翻轉過來的,關於這點開發者不用左而外的處理。另外,左覆蓋視圖的大小設置是在-leftViewRectForBounds:這個方法中設置的。所以,賦予左覆蓋視圖的圖片大小要合適,若是不合適,會自動將其縮放以適應。最後,這個屬性的類型是UIView類型,若是這是控件類型(UIControl),應該像對待全部控件同樣,設置好target和action。

 

三、左覆蓋視圖的出現時機(iOS2.0)

@property(nonatomic) UITextFieldViewMode leftViewMode;

👆這個熟悉過默認值是UITextFieldViewModeNever。

 

四、右覆蓋圖(iOS2.0)

@property(nonatomic, strong) UIView *rightView;

👆結合leftView這個屬性理解吧,同樣的。

 

五、右覆蓋視圖的出現時機(iOS2.0)

@property(nonatomic) UITextFieldViewMode rightViewMode;

👆結合leftViewMode這個屬性理解吧,同樣的。 

 

(7)繪製和定位方法的重寫(⚠️下面的方法不是用來直接調用的,也不是協議方法,而是開發者子類化UITextField的時候,必要狀況下,用來在實現文件中重寫的方法)

一、返回UITextField對象中文本編輯區域的CGRect。(iOS2.0)

- (CGRect)textRectForBounds:(CGRect)bounds;

👆經過接收器(OC語法中的消息接收器)【】自身的bounds,肯定UITextField對象中文本編輯區域的CGRect。在該方法的默認實現下,返回的CGRect是與UITextField的邊界是同樣的,固然若是設置了覆蓋視圖,返回的CGRect是除了覆蓋視圖剩下部分的範圍。 開發者子類化UITextField後,若是對UITextField默認的這種實現方案不滿意,能夠重寫這個方法,根據接收器自身的bounds來計算給出本身滿意的文本編輯區域範圍的CGRect值。

 

二、在指定的CGRect範圍中繪製UITextField對象中文本編輯區域。(iOS2.0)

- (void)drawTextInRect:(CGRect)rect;

👆UITextField對象在剛剛的方法1中能夠獲得須要在那個CGRect下繪製文本編輯區域,接下來iOS系統就會調用這個方法來開始繪製文本編輯區域了。當前圖形上下文已經配置了用於繪圖所須要的默認環境和文本顏色。在重寫這個方法中,能夠進一步配置圖形上下文,而後在調用super的方法執行實際的繪圖。固然,開發者也能夠徹底本身使用繪圖框架【】進行繪圖渲染文本,而不調用super的方法。

 

三、返回UITextField對象中佔位字符串文本區域的CGRect。(iOS2.0)

- (CGRect)placeholderRectForBounds:(CGRect)bounds;

👆結合上面的內容理解這個方法吧,有一點須要注意的是,若是UITextField的placeholder屬性是空字符串或者是nil的話,這個方法就不會被調用了。 

 

四、在指定的CGRect範圍中繪製UITextField對象中佔位字符串文本區域。(iOS2.0)

- (void)drawPlaceholderInRect:(CGRect)rect;

👆結合上面的內容理解這個方法便可。 

 

五、返回UITextField總體內容的繪製CGRect。(iOS2.0)

- (CGRect)borderRectForBounds:(CGRect)bounds;

👆這個屬性怎麼理解呢?咱們知道,UIView的內容是繪製在UILayer(圖層)上面的,圖層的邊界默認是和UIView的邊界是重合的,可是經過這個方法,能夠肯定一遍圖層相對於UIView的位置。 

 

六、返回編輯狀態下文本編輯區域的CGRect。(iOS2.0)

- (CGRect)editingRectForBounds:(CGRect)bounds;

👆這個方法要與前面的第一個方法進行區分理解,UITextField對象在編輯狀態和展現狀態下,或者說在有覆蓋視圖和沒有覆蓋視圖的狀況下,文本編輯區域是不同的。

 

七、返回清除按鈕的CGRect。(iOS2.0)

- (CGRect)clearButtonRectForBounds:(CGRect)bounds;

👆清除按鈕默認是放置在UITextField對象的右邊區域位置,若是想讓清除按鈕放置在其餘的位置上,開發者須要重寫這個方法而且在這個方法中返回一個新的位置。有一點須要注意的是,雖然返回的是CGRect類型,可是開發者只須要改變的是座標orign,大小必要去更改,省得形成圖像失真。那麼如何獲取大小呢,固然是經過在這個方法中調用super的這個方法,獲得CGRect中的size值。畢竟清除按鈕中的「清除icon」不是開發者提供的。 

 

八、返回左覆蓋視圖的CGRect。(iOS2.0)

- (CGRect)leftViewRectForBounds:(CGRect)bounds;

👆左覆蓋視圖和右覆蓋視圖的位置都是有默認的位置的,若是有特殊的需求開發者須要改變它們的位置或者大小,那麼就要重寫這個方法而且在這個方法中返回一個新的CGRect值。注意,因爲左右覆蓋視圖的圖片是能夠經過leftView和rightView這個屬性提供的,所以這個方法返回的CGRect不用像剛剛講到的清除按鈕的CGRect同樣,是既能夠指定新的座標,也能夠指定新的size的,可是爲了避免讓圖片失真,開發者仍是要注意這裏提供的size,要和leftView屬性提供的image的大小要匹配。 

 

九、返回右覆蓋視圖的CGRect。(iOS2.0)

- (CGRect)rightViewRectForBounds:(CGRect)bounds;

👆參考剛剛上面講解到方法理解吧。在這裏補充一點,好比左覆蓋視圖的出現須要讓開發者設置好左覆蓋視圖的圖片、出現時機的設置、左覆蓋視圖的CGRect(同時還要確保可編輯區域的CGRect不要覆蓋到覆蓋視圖的區域)、時機的出現等等要求。 

 

(8)替換系統提供的輸入視圖(inputView)

一、輸入視圖(iOS3.2)

@property(readwrite, strong) UIView *inputView;

👆在文章的上面提到過,當UITextField對象成爲第一響應者的時候,iOS系統會自動的將鍵盤彈出。彈出的是系統標準的鍵盤,若是開發者須要使用自定義的鍵盤,最好是經過這個屬性來操做,雖然就算不用這個屬性也徹底是能夠實現的,可是開發者就須要作不少附帶的操做了,好比,監聽UITextField的點擊事件、自定義鍵盤的動畫彈出、發出各類通知等等。inputView這個屬性值默認是nil,這樣當UITextField對象成爲第一響應者的時候系統使用的就是標準的系統鍵盤。

 

二、輸入視圖上的附件視圖(iOS3.2)

@property(readwrite, strong) UIView *inputAccessoryView;

👆彈出的鍵盤視圖上面的一塊空間是能夠被開發者使用的,無論是使用系統標準鍵盤仍是使用自定義鍵盤,這個屬性均可以實現。使用這個屬性將自定義工具欄附加到鍵盤視圖上面一塊區域,方面用戶的更多便捷操做。 

 

9、與UITextField相關的常見使用場景的技術方案

相關文章
相關標籤/搜索