iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 25
1

原來是像UITextField那傢伙啊!長那麼奇怪化成灰我都認得。


UITextView是個可捲動的多行文字區塊,支援自定義樣式也支援編輯。通常會使用text view顯示多行文字,例如純文字文件的一小部分。

attributedText可使text view支援多重格式(但比iOS 6更早的版本不支援),可以藉由設定這個property的值來使用attributed string裡的style。
當然你也可以使用font、textColor、textAlignment等的properties去設定text view,不過設定值會套用到整個text view上。
所以如果想同時在app的單一文字區塊裡顯示plain text與rich text,則非常建議使用UITextView。

UITextViewDelegate

Keyboard-Related

與text field相同,當使用者點擊可編輯的text view時,text view會切換為first responder,傳遞訊息給delegate並彈出相對應的鍵盤。
由於鍵盤會遮擋部分的畫面,你需要依情況重整視圖位置。
雖然有些view(例如table view)會自動將first responder捲動到可視位置,但如果first responder在視圖的底部,就算怎麼捲還是會被鍵盤擋住,所以還是需要調整視圖的大小或位置以確保first responder是可見的。

而text view同樣需要收起鍵盤,你可以設計與使用者互動的元件,傳送resignFirstResponder()給first responder,讓他退出first responder的身份來收回鍵盤。

當鍵盤彈出與收回的同時會傳送一些Notification,帶著鍵盤大小等資訊。監控這些keyboard-related notification讓你可以藉此重整視圖大小及位置。
系統為text view提供的notification如下:

  • keyboardWillShowNotification
  • keyboardDidShowNotification
  • keyboardWillHideNotification
  • keyboardDidHideNotification

而以下是text view發出訊息給delegate並呼叫function的程序:

  • 使用者點擊text view後,在轉為first responder之前會先發出訊息給delegate,呼叫textViewShouldBeginEditing(_:)。
  • 轉為first responder並發出Keyboard-Related Notifications後,再發出一次訊息,呼叫textViewDidBeginEditing(_:)並發出textDidBeginEditingNotification。
  • 在編輯期間的內文變動都會發出訊息給delegate,呼叫textView(:shouldChangeTextIn:replacementText:)及textViewDidChange(:)並發出textDidChangeNotification。
  • 當結束編輯後,在textField退出first responder的身份之前會先發出訊息給delegate,並呼叫textViewShouldEndEditing(_:)。
  • 退出first responder並發出Keyboard-Related Notifications後,再發出一次訊息並呼叫textViewDidEndEditing(_:)。

另外可以使用UITextInputTraits這個protocol裡的方法來自訂鍵盤類型等外觀,或是控制它的輸入行為。

基本上上述的部分與delegate的properties/functions都與text field大同小異,大家可以參考我之前的文章:

Day 11: UITextField三部曲-住海邊的UITextFieldDelegate

去吧!我把text field的精華都藏在那裡了。

Interacting

text view藉由傳送訊息給delegate,呼叫textView(_:shouldInteractWith:in:interaction:)來決定是否允許使用者在包含文字附件/URL的特定文字範圍內與之產生互動。

允許互動內容為文字附件時,當使用者點擊或長按文字附件而附件內的image為nil時呼叫這個方法,可以藉由此方法觸發動作。

而允許互動內容為URL時,只有在使用者第一次與URL互動時才會呼叫此方法。可以在此方法內定義一個使用者可進行的操作列表,而使用者選取這個列表裡面的方法時,因為已經不算第一次與URL互動,故不會再次呼叫這個function。

因為text view與text field幾乎採用了一模一樣的protocol們,delegate的內容也大同小異,怪不得長得這麼像!
不過還是有不一樣的地方,下回就來說說text view的properties與functions吧!


上一篇
Day 24: 來自深淵-UITableView(IX)
下一篇
Day 26: 要被通緝了啊啊啊UITextView你等等我先發文再說
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言