在項目開發(fā)時遇到一個問題,我在UIViewController上面直接創(chuàng)建了一個UIScrollView敞曹,把UIScrollerView作為一個子視圖添加到了UIViewController胜卤,
又再UIScrollerView中添加了一個UISlider的組件吓肋,在手勢滑動的過程中,很難滑動到UISlider這個控件瑰艘,經(jīng)常是滑動的時候UIScrollerView進行了滾動,
而UISlider這個控件沒有滑動肤舞,讓人很抓狂紫新。
上網(wǎng)具體去了解了一下UIScrollerView的詳解,終于徹底明白了問題出在哪里
下面引用一下前輩的總結(jié)李剖,因為自己覺得沒有他總結(jié)的詳細
UIScrollView重載了hitTest方法芒率,當(dāng)手指touch的時候,UIScrollView會攔截所有event,然后等待150ms篙顺,在這段時間內(nèi)偶芍,如果手指沒有移動,當(dāng)時間結(jié)束時德玫,UIScrollView會發(fā)送tracking event到子視圖上匪蟀,并且自身不滑動。在時間結(jié)束前宰僧,手指發(fā)生了移動材彪,那么UIScrollView就會進行滑動,從而取消發(fā)送tracking。
看來是UIScrollView的問題段化。直接拖動UISlider嘁捷,此時touch時間在150ms以內(nèi),UIScrollView會認為是拖動自己显熏,從而攔截了event雄嚣,導(dǎo)致UISlider接受不到滑動的event。但是只要按住UISlider一會再拖動喘蟆,此時此時touch時間超過150ms缓升,因此滑動的event會發(fā)送到UISlider上。
期間試過幾種方法履肃,只有一種可行仔沿,就是重寫UIScrollView的hitTest方法:當(dāng)滑動UISlider時,使UIScrollView不可滑動尺棋。
但是又出現(xiàn)了一個問題封锉,我的UIScrollerView是直接繼承了UIScrollerView,在UIViewController中是無法重寫的UIScrollerView的hitTest方法的膘螟,所以需要重新創(chuàng)建一個view成福,繼承UIScrollerView,然后再重寫上述方法荆残,然后再導(dǎo)入UIViewController中就可以輕松實現(xiàn)了奴艾。
來自別人的博客
以前我做項目也遇到過類似問題,當(dāng)時找了兩個方法
//[self.myScrollView setCanCancelContentTouches:YES];
//[self.myScrollView setDelaysContentTouches:NO];
發(fā)現(xiàn)效果不好内斯,今天才知道是hitTest的原因蕴潦。