我是一個(gè)非常懶的程序猿静檬,最近讀了幾本閑書(shū)炭懊,發(fā)現(xiàn)自己長(zhǎng)時(shí)間以來(lái)對(duì)自己疏于管理,放逐的厲害拂檩,所以從簡(jiǎn)書(shū)開(kāi)始侮腹,從工作中得到的經(jīng)驗(yàn)開(kāi)始,做一些小小的筆記稻励。有些東西已經(jīng)滿大街都是父阻,那我就當(dāng)是對(duì)這幾年的工作做個(gè)遲到的歸納了~文筆有限,但是希望能幫助解決搜到這篇文章的同學(xué)現(xiàn)有的問(wèn)題望抽。
iOS原生開(kāi)發(fā)應(yīng)該對(duì)UIScrollView熟悉的不能再熟悉了加矛,而它的子類UITableView更是幾大常用控件之一。最近業(yè)務(wù)線做迭代煤篙,其中一個(gè)小組件為一個(gè)可滑動(dòng)的菜單荒椭,樣式如下:
這個(gè)組件只是tableview的一部分,一個(gè)自定義tableviewcell舰蟆,功能簡(jiǎn)單趣惠,實(shí)現(xiàn)起來(lái)也不麻煩。然鵝身害,你就是過(guò)不了設(shè)計(jì)獅的關(guān)味悄。
好吧,過(guò)不了過(guò)不了塌鸯,你說(shuō)來(lái)我聽(tīng)聽(tīng)侍瑟,你想要啥樣~
然后對(duì)方甩給我一張照騙。
內(nèi)心OS:作為一個(gè)設(shè)計(jì)獅,照騙糊成醬紫好意思發(fā)我哈涨颜?
意思就是說(shuō)點(diǎn)擊區(qū)域放大费韭,有淺灰色點(diǎn)擊效果,不僅長(zhǎng)按高亮庭瑰,快速點(diǎn)擊也要有星持,并且高亮的時(shí)候區(qū)域內(nèi)的小圖標(biāo)顏色狀態(tài)不要變。
好吧弹灭,人家這要求不過(guò)分督暂,接了。下面只分享黑色加粗部分的實(shí)現(xiàn)方法哦~
在UIScrollView及其子類上面添加UIControl類的子視圖穷吮,需要注意的是逻翁,當(dāng)我們的手指觸摸到ScrollView的Content區(qū)域內(nèi),scrollView便開(kāi)啟一個(gè)timer進(jìn)行計(jì)時(shí)捡鱼。在一定時(shí)間內(nèi)八回,如果手指沒(méi)有做例如滑動(dòng)操作,之后responder才變成該scrollView的subview驾诈。?這就是之所以加到scrollView上面的button快速點(diǎn)擊的時(shí)候沒(méi)了高亮效果缠诅,而長(zhǎng)按的時(shí)候才有。好了翘鸭,原因了解了,怎么解決呢?
UIScrollView的delaysContentTouches屬性了解一下戳葵?
該屬性的說(shuō)明是:
default is YES. if NO, we immediately call -touchesShouldBegin:withEvent:inContentView:. this has no effect on presses
于是就乓,當(dāng)我們把該屬性設(shè)為NO以后,跳過(guò)了timer環(huán)節(jié)拱烁,而會(huì)立即調(diào)用ContentView上的點(diǎn)擊事件生蚁。所以button的高亮設(shè)置生效。
值得強(qiáng)調(diào)一下的是戏自,像我這個(gè)項(xiàng)目一樣結(jié)構(gòu)的同學(xué)要注意邦投,tableview的cell為自定義,cell上有一個(gè)scrollview且可橫向滑動(dòng)擅笔。所以志衣,我們要把tableview的delaysContentTouches屬性設(shè)為NO,要把scrollview的delaysContentTouches設(shè)為NO,tableview在iOS7以后會(huì)有UITableViewWrapperView這個(gè)子視圖猛们,該視圖也屬于scrollview念脯,所以要把這個(gè)對(duì)象的delaysContentTouches也要設(shè)為NO,總之不要遺漏button上的任何一個(gè)superview弯淘,還有superview的superview绿店。。。(UITableViewWrapperView這個(gè)子視圖很神秘假勿,模擬器上沒(méi)有借嗽,iOS7以上真機(jī)有,iOS12沒(méi)有转培,適配范疇恶导,有興趣的同學(xué)可以了解一下~)
tableView.delaysContentTouches = NO;
for(idviewintableView.subviews) {
? ? ? ? if([viewrespondsToSelector:@selector(setDelaysContentTouches:)]){
? ? ? ? ? ? [viewsetDelaysContentTouches:NO];
? ? ? ? }
? ? }
好了,大家以為這就完事了堡距?NO,還差一點(diǎn)點(diǎn)甲锡,看下圖:
按鈕響應(yīng)快速點(diǎn)擊搞定了,但是羽戒,按鈕觸發(fā)區(qū)域內(nèi)滑動(dòng)失效缤沦。不賣關(guān)子直接上代碼:
- (BOOL)touchesShouldCancelInContentView:(UIView*)view{
? ? ?returnYES;
}
我們需要重寫(xiě)UIScrollview的這個(gè)方法來(lái)確保即使我們觸到了UIControl類, 我們也希望拖動(dòng)時(shí)能取消掉動(dòng)作以便響應(yīng)滾動(dòng)動(dòng)作易稠。這樣一來(lái)缸废,我們的button既可快速點(diǎn)擊有高亮效果,又不耽誤scrollview的滑動(dòng)驶社。一舉兩得企量。
效果如下: