最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS ScrollView嵌套tableView聯動滾動的思路與最佳實踐

 更新時間:2019年10月20日 09:34:47   作者:Ly夢k  
這篇文章主要給大家介紹了關于ScrollView嵌套tableView聯動滾動的思路與最佳實踐,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

隨著業(yè)務的發(fā)展,頁面的復雜度越來越高,嵌套滾動視圖的方式也越來越受設計師們的青睞,在各大電商App十分常見。如下Demo圖:

但是這樣的交互官方并不推薦,而且對開發(fā)來說確是不那么友好,需要處理滾動手勢的沖突,頁面的多層級嵌套都給開發(fā)帶來了一定程度的麻煩。接下里我聊聊我們的實現思路。

思路和過程

對應這種頁面結構應該毫無疑問是最底層是一個縱向滾動的scrollView,它的頁面上面放一個固定高度的header,緊接著下面一個支持橫向滾動切換的容器scrollView,容器上面才是各個頁面具體的tableView,如下圖:

思路一

最先想到的是,既然是滾動視圖那么我們是否可以通過滾動視圖的可滾動屬性來做呢,在初始時把最上層具體業(yè)務的tableView禁止?jié)L動,那么根據事件響應鏈,滾動事件事件會由底層的ScrollView接收并處理,在到達最大偏移量之后,禁用底層的ScrollView滾動,同時開啟上層的tableView,使得上層可以滑動,想起來是有一定可行性的,可惜,事實現實是殘酷的,效果如下:

這樣會導致當偏移量到達臨界值時,由于設置了scrollEnable屬性和最大偏移量,此次滾動手勢會被截斷,需要再次拖拽才能繼續(xù)滾動,顯然,這樣的效果是無法接受的。

思路二

這是同事提供的思路,在做這個時和同事有過討論,他們之前有這樣的交互頁面,使用的是自定義手勢,但由于UIScrollView是有彈性效果的,一般的滑動手勢做不到這一點的,所以需要引入UIDynamic模擬力場,實現阻尼效果。想了一下,雖然有一定的可行性,但是為了一個聯動滑動,要做這么多的事情,感覺比較繁瑣,而且自定義手勢做的模擬彈性效果可能和原生ScrollView的效果還是有一定的差距,所以選擇放棄。

思路三

回到我們思路一,除了邊界位置會阻斷聯動滾動外,其他效果還是可以的,那么能不能通過手段解決這個問題呢?既然能寫到了這里,那么毫無疑問,肯定是可以的。通過手勢穿透,即讓一個滑動手勢既作用于底層的ScrollView又能作用于上層的業(yè)務tableView,同時控制他們的滾動即可達成目的。通過讓底層的scrollView實現一個手勢識別的協(xié)議,同時響應滾動事件:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
 return true
 }

根據官方文檔描述:

Asks the delegate if two gesture recognizers should be allowed to recognize gestures simultaneously.

表達的意思是詢問委托是否允許兩個手勢識別器同時識別手勢,那么我們實現這個協(xié)議,”穿透“手勢,分別在底層容器和上層業(yè)務中實現滾動視圖的代理方法func scrollViewDidScroll(_ scrollView: UIScrollView),分別控制他們的可滾動狀態(tài)和偏移量則能實現目的。部分實現如下:

底層容器ScrollView:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  headerView.isHidden = scrollView.contentOffset.y >= maxOffset ? true : false
  if !superCanScroll {
   scrollView.contentOffset.y = maxOffset
   currentVC.childCanScroll = true
  } else {
   if scrollView.contentOffset.y >= maxOffset {
    scrollView.contentOffset.y = maxOffset
    superCanScroll = false
    currentVC.childCanScroll = true
   }
  }
 }

上層業(yè)務tableView:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  if !childCanScroll {
   scrollView.contentOffset.y = 0
  } else {
   if scrollView.contentOffset.y <= 0 {
    childCanScroll = false
    superCanScrollBlock?(true)
   }
  }
 }

通過底層ScrollView是否達到最大偏移量控制header的顯示隱藏和對應的偏移量及可滾動狀態(tài),在業(yè)務tableView使用回調將ScrollView的可滾動狀態(tài)回調達到狀態(tài)同步??傮w來說還是比較清晰,更多細節(jié)請看QFMultipleScrollView

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • IOS代碼筆記之網絡嗅探功能

    IOS代碼筆記之網絡嗅探功能

    這篇文章主要為大家詳細介紹了IOS網絡嗅探功能實現代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • iOS仿微信搖一搖功能

    iOS仿微信搖一搖功能

    這篇文章主要為大家詳細介紹了iOS仿微信搖一搖功能的實現方法 ,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • iOS應用開發(fā)中UITableView的分割線的一些設置技巧

    iOS應用開發(fā)中UITableView的分割線的一些設置技巧

    這篇文章主要介紹了iOS應用開發(fā)中UITableView分割線的一些設置技巧,包括消除分割線的方法,示例代碼為傳統(tǒng)的Objective-C語言,需要的朋友可以參考下
    2016-03-03
  • ios 單利的完整使用實例 及銷毀 宏定義

    ios 單利的完整使用實例 及銷毀 宏定義

    下面小編就為大家分享一篇ios 單利的完整使用實例 及銷毀 宏定義,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • iOS tableView多輸入框如何獲取數據

    iOS tableView多輸入框如何獲取數據

    這篇文章主要給大家介紹了關于iOS tableView多輸入框如何獲取數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 微信支付開發(fā)IOS圖文教程案例

    微信支付開發(fā)IOS圖文教程案例

    這篇文章主要介紹了微信支付開發(fā)IOS案例的相關資料,需要的朋友可以參考下
    2016-04-04
  • iOS中常用的宏定義總結

    iOS中常用的宏定義總結

    這篇文章主要給大家介紹了關于iOS中常用的宏定義的相關資料,例如UI元素、Log、系統(tǒng)、顏色類等等的示例代碼,文中介紹地方非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-08-08
  • iOS sqlite對數據庫的各種操作(日常整理全)

    iOS sqlite對數據庫的各種操作(日常整理全)

    在IOS中使用Sqlite來處理數據。如果你已經了解了SQL,那你可以很容易的掌握SQLite數據庫的操作。本文給大家介紹iOS sqlite對數據庫的各種操作,需要的朋友參考下吧
    2016-03-03
  • iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決

    iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決

    這篇文章主要介紹了iOS使用WKWebView加載HTML5不顯示屏幕寬度的問題解決,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • iOS實現搭建聊天頁面的實例代碼

    iOS實現搭建聊天頁面的實例代碼

    本篇文章主要介紹了iOS實現搭建聊天頁面的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論

广安市| 蒲城县| 六枝特区| 阿图什市| 师宗县| 桓台县| 江川县| 台州市| 名山县| 建水县| 罗平县| 秦皇岛市| 宁阳县| 班戈县| 勃利县| 乐昌市| 合川市| 孟村| 桦甸市| 古交市| 和硕县| 合川市| 沅陵县| 隆子县| 绵竹市| 汉川市| 广水市| 丹东市| 璧山县| 绥芬河市| 嘉祥县| 吐鲁番市| 望奎县| 土默特左旗| 兰西县| 云南省| 惠东县| 平陆县| 扎鲁特旗| 灵宝市| 武宣县|