前言
過年期間,少不了各種聚會诊沪,當(dāng)下聚會大多數(shù)情況下自然是團購养筒,然后就是用各種APP。娄徊。。使用度娘糯米時(不是廣告盾戴,不是廣告寄锐,不是廣告!)尖啡,偶然注意到了它的首頁中一個有意思的效果橄仆,就是那些“按鈕”點擊時的縮放動畫,有一種“按下去”的趕腳衅斩,恰逢前陣子做過一個錄音按鈕的“點動”效果盆顾,忍不住便封裝了這個按鈕效果:GitHub
demo中的按鈕背景圖片截取自度娘糯米首頁畏梆,僅供學(xué)習(xí)參考您宪!
糯米首頁應(yīng)該是collectionView布局吧?也許奠涌,這里只是純粹實現(xiàn)效果宪巨,封裝了系統(tǒng)的按鈕。
關(guān)于這個效果溜畅,首先不得不提一個概念——點動捏卓。
1.關(guān)于“點動”按鈕
點動這一概念,我是從硬件那邊搬過來的慈格。
曾經(jīng)做單片機時怠晴,按鍵是一個很重要的外設(shè)遥金,硬件按鍵在編寫代碼實現(xiàn)功能時,一般有兩種效果:帶鎖按鈕蒜田,不帶鎖按鈕稿械。
所謂帶鎖按鈕,就是點擊按鈕之后立刻松手物邑,就能實現(xiàn)對應(yīng)功能溜哮,例如我們曾經(jīng)用過的按鍵手機的數(shù)字鍵都是這樣的。
所謂不帶鎖按鈕色解,也就是這里要說的“點動”茂嗓,顧名思義,就是點擊就動科阎,松手即停述吸。單片機那邊一般在電機控制什么的場景經(jīng)常用到,在我們軟件這邊锣笨,較普遍的一個應(yīng)用場景就是“錄音按鈕”(微信語音神馬的)蝌矛。
錄音按鈕在點擊時進行錄音,一旦松手错英,錄音就會停止入撒。
為了便于說明,寫了以下效果進行演示椭岩,button的showsTouchWhenHighlighted
屬性打開以指示按鈕正在被點擊中茅逮。
2.實現(xiàn)“點動”按鈕
實現(xiàn)按鈕的“點動”其實很簡單:
//按下時
[myButton addTarget:self
action:@selector(pressedEvent:)
forControlEvents:UIControlEventTouchDown];
//松手后
[myButton addTarget:self
action:@selector(unpressedEvent:)
forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
接下來在按鈕的點擊響應(yīng)實現(xiàn)中:
- (void)pressedEvent:(id)sender
實現(xiàn)的是按鈕按下的響應(yīng),例如錄音開始并持續(xù)判哥。
- (void)unpressedEvent:(id)sender
則實現(xiàn)的是松開按鈕(停止點擊)時的響應(yīng)献雅,此時執(zhí)行結(jié)束錄音。
兩個響應(yīng)結(jié)合起來塌计,也就實現(xiàn)了硬件按鈕的“點動”效果(硬件按鍵是根據(jù)高低電平判定的挺身,所以代碼實現(xiàn)十分簡單,對單片機有興趣的朋友可以查閱相關(guān)資料锌仅,不過硬件按鍵按下時的電平“抖動”則是十分令人頭疼的問題)章钾。
這里還要提一點,就是ControlEvents
热芹,這里寫的是UIControlEventTouchUpInside | UIControlEventTouchUpOutside
伍玖,意思就是在按鈕區(qū)域范圍內(nèi)或者范圍外(按下之后,手指移動拖移)松手(停止點擊)剿吻,都會執(zhí)行“松手響應(yīng)”窍箍,這在一些情況下要注意區(qū)分,例如接下來要實現(xiàn)的“縮放按鈕”。如果我們只寫UIControlEventTouchUpInside
椰棘,那么纺棺,我們在按鈕區(qū)域范圍外松手,也就是點擊之后邪狞,手指拖動祷蝌,移到按鈕frame外,unpressedEvent
響應(yīng)是不執(zhí)行的帆卓,我們從而也就實現(xiàn)了一個“取消”效果巨朦,當(dāng)然這個不是用在錄音按鈕中的。
3.動畫縮放按鈕
前面啰嗦了一大堆剑令,現(xiàn)在切入正題糊啡,其實,正題也就沒什么要說的了吁津,實現(xiàn)糯米的這一效果棚蓄,無非還是上面的“動作拆分”思想,我們只要將按鈕按下的縮放動畫碍脏,以及動畫執(zhí)行之后的真正的響應(yīng)梭依,分別寫在兩個響應(yīng)函數(shù)中就可以了。
//按鈕的按下事件 按鈕縮小
- (void)pressedEvent:(JXTPushInButton *)btn
{
//縮放比例必須大于0典尾,且小于等于1
CGFloat scale = (_buttonScale && _buttonScale <=1.0) ? _buttonScale : defaultScale;//defaultScale默認為0.9
[UIView animateWithDuration:animateDelay animations:^{
btn.transform = CGAffineTransformMakeScale(scale, scale);
}];
}
//按鈕的松開事件 按鈕復(fù)原 執(zhí)行響應(yīng)
- (void)unpressedEvent:(JXTPushInButton *)btn
{
[UIView animateWithDuration:animateDelay animations:^{
btn.transform = CGAffineTransformMakeScale(1.0, 1.0);
} completion:^(BOOL finished) {
//執(zhí)行動作響應(yīng)
if (self.clickBlock) {
self.clickBlock();
}
}];
}
按鈕按下真正要執(zhí)行的響應(yīng)役拴,封裝在了block中,button的封裝詳見我傳到github中的代碼钾埂,調(diào)用很方便河闰,還是一句話:
JXTPushInButton * btn = [JXTPushInButton touchUpOutsideCancelButtonWithType:UIButtonTypeCustom frame:CGRectMake(0, 0, ScreenWidth - 20, 80) title:@"按鈕-1" titleColor:[UIColor blackColor] backgroundColor:[UIColor redColor] backgroundImage:nil andBlock:^{
NSLog(@"frame內(nèi)部松手執(zhí),行按鈕-1");
}];
[self.view addSubview:btn];
參考文章:
1.UIButton---按住錄音勃教,松開停止
2.iOS下UIButton壓下后播放動畫淤击,松開后動畫消失的實現(xiàn)