iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
1
自我挑戰組

Hey! UIKit, 做個朋友吧~系列 第 15

Day 15:終於要打王了...納命來吧UIControl!!

  • 分享至 

  • xImage
  •  

UIControl就是前幾位UIKit仔的老爸,負責管理Control類別-就是在與使用者互動後會回傳一個響應並執行target-action的各位的老大。換言之就是UIControl有的特性方法前面幾位都有,果然是有其父必有其子。

一般而言不會去建立UIControl的實體,這很合理,通常老大都是躲在後面死都不肯出來,只會派小嘍囉出去給勇者練等級。
因為小嘍囉都會繼承UIControl的屬性以及方法,所以UIControl其實是拿來定義小嘍囉們共有的特性,工具人感好重的老大。如果你94生來顛覆,也可以複寫老大給你的方法特性以改變各自的行為。

State

state代表了UIKit的狀態,本身有normal、highlighted、selected...等,利用指定isHighlighted、isSelected等方法的布林值來實現,如果沒特別指定的話,預設狀態為normal。
state也可以拿來決定與使用者互動的權限,如果isEnabled有條件的設為false(disabled狀態),則使用者便無法與他進行互動,直到滿足條件為止。

範例可參考利用UIButton的State來實作點擊後的按鈕變化吧~(自產自銷)。

Target-Action Mechanism

UIControl有一個target-action機制,可以讓與使用者互動這件事情變得簡單。你只需要指定響應的動作,並選擇相對應的UIEvent,UIControl會幫你偵測與使用者相關的event,並決定何時呼叫你的function。

那要如何讓控制件加入target-action?答案是使用addTarget(:action:for:)這個function。這個function指定了接收selector的對象(target)、響應的事件(selector function)以及偵測到什麼樣的UIEvent下會觸發,另外用removeTarget(:action:for:)取消控制件的target-action。
雖然target可以是任何物件,但通常是包含控制件的ViewController,如果設定為nil的話,控制件將會自行搜尋在響應鏈中定義selector function的對象。

taget-action有分一般、控制件符合下即觸發、以及控制件和事件都符合的情況下才觸發:

@IBAction func doSomething()
@IBAction func doSomething(sender: UIButton)
@IBAction func doSomething(sender: UIButton, forEvent event: UIEvent)

UIEvent定義了許多與使用者互動時會回傳的訊息,讓控制件可以藉此決定target-action及其執行的時機。例如與button相關的有touch down和touch up inside等等,而與slider相關的是value change。而當控制件收到訊息之後,會馬上呼叫相對應的function。

另外可以使用actions(forTarget:forControlEvent:)得知該target在收到不同的event下會執行哪些target-action。而allControlEvents及allTargets則是得知目前有被控管的event以及target。

Alignment

alignment的的功用在於調整元件內文和圖片的水平及垂直位置,contentVerticalAlignment用來調整垂直位置,而contentHorizontalAlignment則是用來調整水平位置,並可以用effectiveContentHorizontalAlignment取得現階段的水平對其狀態。

finnButton.contentVerticalAlignment = .bottom
jackButton.contentHorizontalAlignment = .right

(阿寶老皮重出江湖)
這個alighment只會影響元件的內容,而不會影響元件本身的位置,如果要對元件本身的位置進行調整則需要使用auto layout。

Subclassing Notes

如果你想要加入UIControl的麾下,可以繼承UIControl。他會提供你2個function覆寫,讓你的class擁有類似target-action的機制以及收發event的能力:

  • sendAction(:to:for:)-在觸發event後傳送一個selector function給target作為target-action,是不是跟addTarget(:action:for:)幾乎是一模一樣呢?

  • beginTracking(:with:), continueTracking(:with:), endTracking(:with:), cancelTracking(:with:)-用來追蹤UIEvent與使用者互動的狀況。覆寫並添加內容到這4個function,可以讓event在不同情形下執行額外的動作。

Internationalization

由於UIControl是個抽象類別,你並不需要對他做Internationalization的動作,只需要對他的子類別進行處理即可。

Accessibility

為了使VoiceOver可以提供精準及有幫助的資訊給輔助使用者,需清楚定義介面上元件的位置、名稱、類型、響應行為等特性。視障者同樣也可以依賴VoiceOver輔助使用。

而控制件支援以下幾種輔助使用的特性:

  • 標籤-一段在地化文字/片語,可以簡潔的描述該視圖或控制件。像"Add"或"Play"。
  • 特性-一個或多個獨立特性的組合,描述了元件的狀態、行為以及用途等訊息。
  • 提示-一個簡短的在地化片語,描述了執行該元件後所觸發的動作。例如"Adds a title"或是"Opens the shopping list"。
  • 結構-描述了元件在螢幕上的位置及大小。
  • 值-描述了元件的當前值,不同於label。例如slider的label可能是"Speed",當前值是"50%"。

UIControl本身提供了預設的值於結構的資訊,其中子類別也有額外提供特性等資訊,不需要額外做設定。其他資訊的部分,可以使用程式碼或Interface Builder裡的Identity inspector指定。

終於講完了UIControl,下一回要講什麼呢我也沒有頭緒...
我已經沒有庫存文章了,還留在這裡惹人嫌嗎QQ


上一篇
Day 14: 到底要on還是要off?選擇障礙的我與UISwitch
下一篇
Day 16: 來自深淵-UITableView(I)
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言