問題表現(xiàn):
uiscrollerView 上添加UIButton 表情按鈕
不知道為什么uiscrollerView 點擊的時候應(yīng)該有個150ms的響應(yīng)時間,150ms檢測沒有滑動事件才會把點擊事件傳給子視圖。這個delay屬性設(shè)置成 YES也沒用
按照 ![http://blog.sina.com.cn/s/blog_71715bf80101ie1e.html] 重寫了UIScrollerView 設(shè)置表情scrollerview delaysContentTouches 屬性為 YES; touchesShouldCancelInContentView 也設(shè)置了為YES.不行
把UIButton 換成 uiImage 加 tap手勢,點擊和滑動都可以。換成UIControl 也不行會立即觸發(fā)TouchDown事件。
新建一個工程,在scrollerView上放上UIButton快速滑動,沒問題。150ms的響應(yīng)處理過程,存在。可能是工程插入的分類問題。
慢慢移除與UIscollerView 與 UIButton UIContol相關(guān)分類。最終問題定義在了DZNEmptyDataSet工具類上。升級版本后解決問題 DZNEmptyDataSet (1.8.1)
附:UIScrollerView 檢測Touch原理:
當(dāng)UIScrollView接收到一個touch時,它會在一段時間(好像是150ms)內(nèi)監(jiān)聽該touch是否移動了,假如移動了(應(yīng)該有一個移動范圍),則取消將touch發(fā)送到其子視圖(例如UIButton),UIScrollView自身接受該touch,進行滑動。
如果想UIScrollerView立即將事件傳給UIButton.
UIScrollView中有一個屬性叫delaysContentTouches
官方文檔對它的解釋是:If the value of this property is YES, the scroll view delays handling the touch-down gesture until it can determine if scrolling is the intent. If the value is NO , the scroll view immediately calls touchesShouldBegin:withEvent:inContentView:. The default value is YES.
意思就是設(shè)置為NO就不會存在那個150ms的判斷時間了,直接執(zhí)行后續(xù)操作.設(shè)置為NO后,UIButton立即響應(yīng)并高亮。
設(shè)置完這個屬性后,你會發(fā)現(xiàn)UIScrollView滑動不像以前那樣了,假如touch down的那點落在UIButton上然后再滑動手指,UIScrollView不會滑動,但是UIButton仍然觸發(fā),當(dāng)然,這樣的結(jié)果也是應(yīng)該的,你想想,設(shè)置delaysContentTouches為NO后,只要手指點在UIButton上,UIScrollView就會立即判定為這是點擊UIButton,而不會再等待看手指是否移動來決定是否要滑動本身了。
有沒有什么方法可以在touch到UIbutton上并滑動時不觸發(fā)UIButton而讓UIScrollView自己滑動呢,強大的iOS沒有讓你失望,
UIScrollView中有一個方法:touchesShouldCancelInContentView:
來看它的解釋:The scroll view calls this method just after it starts sending tracking messages to the content view. If it receives NO from this method, it stops dragging and forwards the touch events to the content subview. The scroll view does not call this method if the value of the canCancelContentTouches property is NO.意思就是當(dāng)UIScrollView將touch事件交給子view后,當(dāng)手指發(fā)生滑動時,調(diào)用此方法,假如返回NO,則將touch事件交給子view,如果返回YES,則交給UIScrollView處理,產(chǎn)生滑動。
(但是前提是UIScrollView的canCancelContentTouches屬性是YES才會調(diào)用這個方法,只要不是UIControll的子類,這個屬性默認是YES。)所以只要重寫UIScrollView的這個方法并返回YES就可以啦,到此問題就解決了。既能立即響應(yīng)UIButton,也能自由滑動UIScrollView。
2016-10-11號最終發(fā)現(xiàn)是 DZNEmptyDataSet 這個空白頁第三方庫版本太低所致,pod 安裝最新的版本后解決