場景
像上圖展示的圖片一樣,每次用戶點擊上下左右不同方向的時候,需要向機(jī)器人發(fā)送指令,其實就是發(fā)送一條IM消息。但是要求就是點擊下去的時候發(fā)送向各個方向行走的指令,當(dāng)手指脫離的時候發(fā)送停止指令,也就是只要手指不松開就不發(fā)送停止指令,并且還需要對這個手指點擊 離開的時間做判斷。一開始閃過的是通過手勢,后來仔細(xì)想了一下,感覺用手勢做的話,添加手勢還有手勢處理的代碼比價多,果斷不喜歡。想到用按鈕做可能就更好一點,so ,好像看到了一個更好的處理方法。
初步
大多數(shù)對于按鈕的操作都是如下所示
[_registerBtn addTarget:selfaction:@selector(regiestAction:)forControlEvents:UIControlEventTouchUpInside];
處理最多的是TouchUpInside,然后點進(jìn)去尋找這個枚舉里面更多的內(nèi)容
排在第一UIControlEventTouchDown,表示當(dāng)點擊的時候就會觸發(fā),再加上UIControlEventTouchUpInside的配合正好可以滿足這種需求。一個是當(dāng)手指剛放上去,另一個則是手指離開按鈕,并且能夠取到這種時間差
因為需要多個按鈕 而且每一個都需要做這種處理,要是每一個都是按鈕都按照下面那么直白的寫法,肯定不行啊!
//手指剛點擊按鈕 [self addTarget:self action:@selector(pressedEvent:) forControlEvents:UIControlEventTouchDown]; //手指離開按鈕 [self addTarget:self action:@selector(pressedEndEvent:) forControlEvents:UIControlEventTouchUpInside];
過程
若是用繼承來寫的話,感覺這樣的做法太重了,而且對于耦合度而言感覺是得不償失,另外需要注意的這里面還有個需要對這個點擊操作持續(xù)時間的處理,即從手指放到按鈕上到手指離開按鈕這段時間。于是就想到了用類別category,順帶可以把按鈕的點擊事件用block來處理了。不過這里就需要運(yùn)用到一點runtime的知識了,需要動態(tài)的給UIButton添加屬性,不過這里不做重點講述,可以看demo中的具體代碼,以后會寫相關(guān)內(nèi)容。
objc_setAssociatedObject(self, &pressedKey, pressblock, OBJC_ASSOCIATION_COPY_NONATOMIC); objc_setAssociatedObject(self, &unpressedKey, unpressedblock,OBJC_ASSOCIATION_COPY_NONATOMIC);
pressedBlock block = (pressedBlock)objc_getAssociatedObject(self, &pressedKey); unpressedBlock block = (unpressedBlock)objc_getAssociatedObject(self, &unpressedKey);
//執(zhí)行點動效果(放大) [UIView animateWithDuration:selfAnimateTime animations:^{ self.transform = CGAffineTransformMakeScale(1.0, 1.0); } completion:^(BOOL finished) { //此處是當(dāng)按鈕的放大動畫做完之后可以進(jìn)行后續(xù)的操作 根據(jù)自身業(yè)務(wù)調(diào)節(jié) }];
上面為category中的一部分代碼,詳細(xì)流程與代碼請到GitHub。
希望小伙伴多一起交流進(jìn)步????。