1. 程式人生 > >UIControl 的基本使用方法和 Target-Action 機制

UIControl 的基本使用方法和 Target-Action 機制

來源: 南峰子(@南峰子_老驢)

我們在開發應用的時候,經常會用到各種各樣的控制元件,諸如按鈕(UIButton)、滑塊(UISlider)、分頁控制元件(UIPageControl)等。這些控制元件用來與使用者進行互動,響應使用者的操作。我們檢視這些類的繼承體系,可以看到它們都是繼承於UIControl類。UIControl是控制元件類的基類,它是一個抽象基類,我們不能直接使用UIControl類來例項化控制元件,它只是為控制元件子類定義一些通用的介面,並提供一些基礎實現,以在事件發生時,預處理這些訊息並將它們傳送到指定目標物件上。

本文將通過一個自定義的UIControl子類來看看UIControl的基本使用方法。不過在開始之前,讓我們先來了解一下Target-Action機制。

Target-Action機制

Target-action是一種設計模式,直譯過來就是”目標-行為”。當我們通過程式碼為一個按鈕新增一個點選事件時,通常是如下處理:

[button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];

也就是說,當按鈕的點選事件發生時,會將訊息傳送到target(此處即為self物件),並由target物件的tapButton:方法來處理相應的事件。其基本過程可以用下圖來描述:

注:圖片來源於官方文件Cocoa Application Competencies for iOS – Target Action

即當事件發生時,事件會被髮送到控制元件物件中,然後再由這個控制元件物件去觸發target物件上的action行為,來最終處理事件。因此,Target-Action機制由兩部分組成:即目標物件和行為Selector。目標物件指定最終處理事件的物件,而行為Selector則是處理事件的方法。

有關Target-Action機制的具體描述,大家可以參考Cocoa Application Competencies for iOS – Target Action。我們將會在下面討論一些Target-action更深入的東西。

例項:一個帶Label的圖片控制元件

回到我們的正題來,我們將實現一個帶Label的圖片控制元件。通常情況下,我們會基於以下兩個原因來實現一個自定義的控制元件:

  • 對於特定的事件,我們需要觀察或修改分發到target物件的行為訊息。

  • 提供自定義的跟蹤行為。

本例將會簡單地結合這兩者。先來看看效果:

這個控制元件很簡單,以圖片為背景,然後在下方顯示一個Label。

先建立UIControl的一個子類,我們需要傳入一個字串和一個UIImage物件:

@interface ImageControl : UIControl

- (instancetype)initWithFrame:(CGRect)frame title:(NSString*)title image:(UIImage*)image;

@end

基礎的佈局我們在此不討論。我們先來看看UIControl為我們提供了哪些自定義跟蹤行為的方法。

跟蹤觸控事件

如果是想提供自定義的跟蹤行為,則可以重寫以下幾個方法:

- (BOOL)beginTrackingWithTouch:(UITouch*)touchwithEvent:(UIEvent*)event

- (BOOL)continueTrackingWithTouch:(UITouch*)touchwithEvent:(UIEvent*)event

- (void)endTrackingWithTouch:(UITouch*)touchwithEvent:(UIEvent*)event

- (void)cancelTrackingWithEvent:(UIEvent*)event

這四個方法分別對應的時跟蹤開始、移動、結束、取消四種狀態。看起來是不是很熟悉?這跟UIResponse提供的四個事件跟蹤方法是不是挺像的?我們來看看UIResponse的四個方法:

- (void)touchesBegan:(NSSetUITouch *> *)toucheswithEvent:(UIEvent*)event

- (void)touchesMoved:(NSSetUITouch *> *)toucheswithEvent:(UIEvent*)event

- (void)touchesEnded:(NSSetUITouch *> *)toucheswithEvent:(UIEvent*)event

- (void)touchesCancelled:(NSSetUITouch *> *)toucheswithEvent:

相關推薦

no