標籤:
今天做了一個項目,有這樣一個需求,就是一個大的scrollview包含一個小的scrollview,如何滑動小的scrollview的時候,大的scrollview滑動,小的srollview不滑動。
我們知道當多個視圖進行疊加的時候,touch事件是作用到最上面的視圖上,但是如果父視圖是UIScrollView,如果預設,可能touch子視圖會造成UIScrollView的滾動。
UIScrollView滾動的原因,可以看UIScrollView 原理。
我在這裡簡單的描述一下,UIScrollView的工作原理,當手指touch的時候,UIScrollView會攔截Event,會等待一段時間,在這段時間內,如果沒有手指沒有移動,當時間結束時,UIScrollView會發送tracking events到子視圖上。在時間結束前,手指發生了移動,那麼UIScrollView就會進行移動,從而取笑發送tracking。
那麼,UIScrollView的子類想要接受touch事件,就是使用者點擊UIScrollView上的視圖時,要先處理視圖上的touch,而不發生滾動。這時候就需要UIScrollView的子類重載touchesShouldBegin:withEvent:inContentView: ,從而決定自己是否接受子視圖中的touch事件。
- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { NSLog(@"使用者點擊了scroll上的視圖%@,是否開始滾動scroll",view); //返回yes 是不滾動 scroll 返回no 是滾動scroll return YES; } - (BOOL)touchesShouldCancelInContentView:(UIView *)view { NSLog(@"使用者點擊的視圖 %@",view); //NO scroll不可以滾動 YES scroll可以滾動 return NO; }
重寫了- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view方法和- (BOOL)touchesShouldCancelInContentView:(UIView *)view方法。
其中(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view,是使用者點擊小的scrollview地區內,先觸發這個方法,當返回YES時,touch事件作用到小的scrollview視圖上(不滑動),當返回no時,大的scrollview可以上下滾動,小的scrollview不滑動。
-(BOOL)touchesShouldCancelInContentView:(UIView *)view是發送tracking前,先作用這個方法。
最後scrollview初始化的時候還要設定一下幾個屬性:
//NO 發送滾動的通知 但是就算手指移動 scroll也不會動了 YES 發送通知 scroll可以移動 [myScrollview setCanCancelContentTouches:YES]; [myScrollview setBounces:NO]; // NO 立即通知touchesShouldBegin:withEvent:inContentView 看是否滾動 scroll [myScrollview setDelaysContentTouches:NO]; // 這句是關鍵,預設為YES,不設為NO則touchesShouldBegin:withEvent:inContentView:可能不被回調
好了,這樣就完美的解決了上述問題。
小胖說事10------iOS scrollview作用原理(一個大的scrollview包含一個小的scrollview,如何滑動小的scrollview的時候,大的scrollview滑動小的不動