swift的手勢點擊事件比Objective-C簡潔多了检激。今天寫了個小需求:
點擊不同的label就改變對應(yīng)的標(biāo)簽顏色涝滴。
好的朝蜘,我們看一下效果圖:
首先搬瑰,看一下蘋果官網(wǎng)的說明:
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
}
}
具體的子類如下: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.(就是實現(xiàn)對某些行為的更細(xì)粒度的自定義)
UIGestureRecognizerUIGestureRecognizerDelegate
手勢識別器根據(jù)對特定視圖和所有視圖的子視圖進(jìn)行經(jīng)過測試的觸摸進(jìn)行操作睡蟋。因此必須與該觀點相關(guān)聯(lián)踏幻。要建立該關(guān)聯(lián),您必須調(diào)用該UIView方法戳杀。手勢識別器不參與視圖的響應(yīng)者鏈该面。addGestureRecognizer(_:)
手勢識別器具有與其相關(guān)聯(lián)的一個或多個目標(biāo) - 動作對。如果存在多個目標(biāo) - 動作對信卡,則它們是離散的隔缀,而不是累積的。對手勢的識別導(dǎo)致向每個關(guān)聯(lián)對的目標(biāo)發(fā)送動作消息傍菇。調(diào)用的操作方法必須符合以下簽名之一:
@IBAction func myActionMethod()
@IBAction func myActionMethod(_ sender: UIGestureRecognizer)
我大概就說這么一些猾瘸,有興趣就去官網(wǎng)研究。
回到我們的主題:
1、給label 添加手勢
label.isUserInteractionEnabled = true
let tapGes = UITapGestureRecognizer(target: self,
action: #selector(self.titleLabelClick(tapGes: )))
2牵触、 添加
// 添加
label.addGestureRecognizer(tapGes)
3淮悼、封裝 點擊獲取不同的label的tag值?
3.1 添加標(biāo)題下標(biāo)索引為0
// 標(biāo)題下標(biāo)索引為0
var currentIndex : Int = 0
3.2 這里主要 是監(jiān)聽 點擊事件 獲取對應(yīng)的tag
// MARK: -- 監(jiān)聽title 的點擊
extension PageTitleView{
// 點擊事件 需要添加 @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
}
}
敲黑板:
看完上面的代碼你有沒有發(fā)現(xiàn)瞧挤,我的代碼是寫在一個 extension 里面的。
category 和 extension 很相似儡湾。
Objective-C的category需要寫擴展名特恬,而swift不需要,只需要一個extension徐钠。
extension主要是提高代碼的可讀性, 對程序運行性能不會有影響. 一般在寫OC時, 習(xí)慣用#pragma mark來標(biāo)記一部分代碼, 在接觸swift項目時, 包括apple的工程師都會用extension把功能相似的代碼方法放在一起, 方便團隊之間的合作.
把同一功能類型 **(UI布局癌刽、屬性計算、代理方法尝丐、事件監(jiān)聽) ** 的代碼用extension分割, 便于后期的代碼維護. 如果同一文件下代碼過多, 可以用extension拆分成多個文件, 使每一個extension文件功能明確,代碼結(jié)構(gòu)更加清晰整潔.
所以swift中建議使用extension進(jìn)行功能性 劃分 显拜, 但不代表你可以亂用,以服務(wù)于整潔爹袁,可讀性強易于維護為原則远荠。