iOS冷知識:任意設置UIScrollView的滑動觸摸區域。

前言

前言:UIScrollView和UITableView是iOS中最常用的控件。而UITableView又是繼承自UIScrollView的,所以一個iOS程序員的工作可能會有很長一段時間是在折騰一個或多個UIScrollView。瞭解UIScrollView的屬性和特點很有必要!

在我們通常的認知裏,想要一個UIScrol lView隨着我們的手指滑動而滑動,那麼我們的手指必須在UIScrollView的範圍內滑動並且這個scrollview上層沒有任何別的view遮擋。但是其實我們是有辦法改變這個範圍的,使得即使我們在UIScrollView以外的地方滑動依舊可以使得UIScorllview產生滑動。

實現

如圖我們在一個viewcontroller的view上添加了一個scrollview,然後又addsubview一個白色的topview遮擋scrollview,那麼當我們嘗試滑動scrollview的時候會發生以下情況:

>本人5年iOS開發經驗,曾就職於阿里巴巴。 善於把艱澀的iOS知識轉化爲通俗易懂的白話文字,同時也歡迎大家加入小編的iOS交流羣 413038000 ,羣裏會提供相關面試資料,書籍歡迎大家入駐!

原因是我們都知道了,根據iOS響應鏈的規則通過hit-test找到找到點擊區域最上層的view,然後通過最上層的view找到firstResponder,讓firstResponder處理這個事件。

響應鏈條在本次滑動事件的處理流程大致如下:當我們嘗試在topview滑動的時候,會使用hit-test來找出最上層的view響應當前滑動事件。監測到白色topview是最上層的view所以會把事件交給白色topview,但是topview並沒有不處理事件,所以需要向它nextResponder也就是它的superview,viewcontroller的view來處理,以此類推,發現並沒有view能夠處理這個事件,所以這個事件被作廢。我們的scrollview全程並未參與自然無法接受事件

關於響應鏈的詳細原理這裏並不展開。

轉機

點開UIScrollView.h,我們能看到UIScrollView有一個屬性panGestureRecognizer:

@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer API_AVAILABLE(ios(5.0));

打印該屬性如下:

(lldb) po self.scrollView.panGestureRecognizer
<UIScrollViewPanGestureRecognizer: 0x7fb24a7080a0; state = Possible; delaysTouchesEnded = NO; view = <UIScrollView 0x7fb24c01b200>; target= <(action=handlePan:, target=<UIScrollView 0x7fb24c01b200>)>>

發現這個手勢是一個UIScrollViewPanGestureRecognizer,也就是處理UIScrollView滑動的手勢,它的view是
view = <UIScrollView 0x7fb24c01b200>;
也就是UIScrollView本身。這也就是爲什麼UIScrollView的滑動一定要在UIScrollView範圍內。
既然UIScrollView把處理滑動的手勢暴露給我們了,那我們是不是可以把這個手勢添加到別的view上呢?
答案是:可以!
正如我們剛纔說的響應鏈的原理,我們只要把UIScrollView的panGestureRecognizer添加到topview和scrollview的共同父view,也就是這裏的UIViewController的view上就可以實現點擊整個屏幕都能滑動UIScrollView了!

    [self.view addGestureRecognizer:self.scrollView.panGestureRecognizer];

再看一下效果:

拓展

由此拓展開來,我們可以把scrollview的panGerturerecognizer屬性添加到任意我們想要添加的view上,實現更加有趣的效果,比如:

[圖片上傳失敗...(image-a8b673-1604125376125)]

最後附上demo

作者:jlstmac
鏈接:https://www.jianshu.com/p/f8a8153a24bc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章