swift的手勢(shì)

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

好的,我們看一下效果圖:


獲取點(diǎn)擊不同的label.png

首先,看一下蘋(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ù)為原則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,215評(píng)論 3 119
  • 之前在鄭州的時(shí)候,一直沒(méi)有總結(jié)寫(xiě)日志的習(xí)慣,只有很短暫的嘗試過(guò)一段時(shí)間,http://zhenghan1221.b...
    最晴天閱讀 2,267評(píng)論 0 0
  • 本來(lái)今天高高興興,結(jié)果出了車(chē)禍,對(duì),又出了。但是這次確實(shí)我自己的原因。 一直到今天下午,工作都很順利,結(jié)果最后一家...
    郭騰達(dá)閱讀 170評(píng)論 0 0
  • 五月春末夏初天氣正好,微風(fēng)習(xí)習(xí)。早上和先生整裝朝著自然原野出發(fā),躑躅于鄉(xiāng)野,呼吸著大自然清新的空氣,尋找著初夏的腳...
    橘子花開(kāi)_ce93閱讀 460評(píng)論 0 2

友情鏈接更多精彩內(nèi)容