swift的手勢(shì)點(diǎn)擊事件比Objective-C簡(jiǎn)潔多了。今天寫(xiě)了個(gè)小需求:
點(diǎn)擊不同的label就改變對(duì)應(yīng)的標(biāo)簽顏色。
好的,我們看一下效果圖:

首先,看一下蘋(píng)果官網(wǎng)的說(shuō)明:
Code that handles tap gestures should therefore test for the state of the gesture, for example:
func handleTap(sender: UITapGestureRecognizer) {
if sender.state == .ended {
// handling code
}
}
具體的子類(lèi)如下:UIGestureRecognizer
UITapGestureRecognizer
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UISwipeGestureRecognizer
UIPanGestureRecognizer
UIScreenEdgePanGestureRecognizer
UILongPressGestureRecognizer
The class defines a set of common behaviors that can be configured for all concrete gesture recognizers.(就是實(shí)現(xiàn)對(duì)某些行為的更細(xì)粒度的自定義)
UIGestureRecognizerUIGestureRecognizerDelegate
手勢(shì)識(shí)別器根據(jù)對(duì)特定視圖和所有視圖的子視圖進(jìn)行經(jīng)過(guò)測(cè)試的觸摸進(jìn)行操作。因此必須與該觀點(diǎn)相關(guān)聯(lián)。要建立該關(guān)聯(lián),您必須調(diào)用該UIView方法。手勢(shì)識(shí)別器不參與視圖的響應(yīng)者鏈。addGestureRecognizer(_:)
手勢(shì)識(shí)別器具有與其相關(guān)聯(lián)的一個(gè)或多個(gè)目標(biāo) - 動(dòng)作對(duì)。如果存在多個(gè)目標(biāo) - 動(dòng)作對(duì),則它們是離散的,而不是累積的。對(duì)手勢(shì)的識(shí)別導(dǎo)致向每個(gè)關(guān)聯(lián)對(duì)的目標(biāo)發(fā)送動(dòng)作消息。調(diào)用的操作方法必須符合以下簽名之一:
@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
我大概就說(shuō)這么一些,有興趣就去官網(wǎng)研究。
回到我們的主題:
1、給label 添加手勢(shì)
label.isUserInteractionEnabled = true
let tapGes = UITapGestureRecognizer(target: self,
action: #selector(self.titleLabelClick(tapGes: )))
2、 添加
// 添加
label.addGestureRecognizer(tapGes)
3、封裝 點(diǎn)擊獲取不同的label的tag值?
3.1 添加標(biāo)題下標(biāo)索引為0
// 標(biāo)題下標(biāo)索引為0
var currentIndex : Int = 0
3.2 這里主要 是監(jiān)聽(tīng) 點(diǎn)擊事件 獲取對(duì)應(yīng)的tag
// MARK: -- 監(jiān)聽(tīng)title 的點(diǎn)擊
extension PageTitleView{
// 點(diǎn)擊事件 需要添加 @objc
@objc func titleLabelClick(tapGes:UITapGestureRecognizer){
// 1、獲取當(dāng)前l(fā)abel
guard let currentLabel = tapGes.view as? UILabel else {
return
}
// 2、獲取之前的label
let oldLabel = titleLabels[currentIndex]
// 3、切換文字的顏色
currentLabel.textColor = UIColor.orange
oldLabel.textColor = UIColor.darkGray
// 3、保存最新label 的下標(biāo)值
currentIndex = currentLabel.tag
}
}
敲黑板:
看完上面的代碼你有沒(méi)有發(fā)現(xiàn),我的代碼是寫(xiě)在一個(gè) extension 里面的。
category 和 extension 很相似。
Objective-C的category需要寫(xiě)擴(kuò)展名,而swift不需要,只需要一個(gè)extension。
extension主要是提高代碼的可讀性, 對(duì)程序運(yùn)行性能不會(huì)有影響. 一般在寫(xiě)OC時(shí), 習(xí)慣用#pragma mark來(lái)標(biāo)記一部分代碼, 在接觸swift項(xiàng)目時(shí), 包括apple的工程師都會(huì)用extension把功能相似的代碼方法放在一起, 方便團(tuán)隊(duì)之間的合作.
把同一功能類(lèi)型 **(UI布局、屬性計(jì)算、代理方法、事件監(jiān)聽(tīng)) ** 的代碼用extension分割, 便于后期的代碼維護(hù). 如果同一文件下代碼過(guò)多, 可以用extension拆分成多個(gè)文件, 使每一個(gè)extension文件功能明確,代碼結(jié)構(gòu)更加清晰整潔.
所以swift中建議使用extension進(jìn)行功能性 劃分 , 但不代表你可以亂用,以服務(wù)于整潔,可讀性強(qiáng)易于維護(hù)為原則。