UITableView嵌套UITableView的流暢滑動(Swift)

本次效果是參考此文(http://www.itdecent.cn/p/38f0b7eef959)實現(xiàn)的,在此多謝此文作者分享!

思路精髓:實現(xiàn)手勢的穿透響應(也就是不論最上層是否有對象響應滑動手勢,都將這個手勢往底層傳遞),給每個tableView 添加一個shouldScroll的實例變量,通過tableView的代理方法監(jiān)聽contentOffset ,根據(jù)偏移量做判斷并發(fā)送相應通知,然后設置不應該滑動的那個tableView的contentOffset為CGPointZero即可。

  • ps: 我為了實現(xiàn)公司的需求,又多嵌套了一層UICollectionView,但萬變不離其宗,思路都是一樣。

先上效果圖

效果動圖.gif

在此,只分析兩個tableView的滑動邏輯

  • 底層的UITableView 命名為 tableView
  • 嵌套在內(nèi)的UITableView 命名為 innerTableView

自定義UITableView,命名為GXInnerTableView,在GXInnerTableView中遵循 UIGestureRecognizerDelegate協(xié)議,并實現(xiàn)如下方法 ,這是實現(xiàn)手勢穿透的關鍵代碼

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

接下來分別實現(xiàn)兩個tableView的ScrollViewDidScroll代理方法

  • tableView的代理方法
          /// tableView是否能夠滾動
        var shouldScroll:Bool = true
            /// 底部的理論上是否應該滾動
        var bottomShouldScroll:Bool = true
            /// 頂部的理論上是否應該滾動
        var upperShouldScroll:Bool = true
        
      func scrollViewDidScroll(scrollView: UIScrollView) {
        print(scrollView.contentOffset.y)
        
        // header頭的高度是150
        let standardOffsetY:CGFloat = 150
        
        let offsetY:CGFloat = scrollView.contentOffset.y
        
        bottomShouldScroll = upperShouldScroll
        
        if offsetY >= standardOffsetY{ //如果偏移量大于header頭的高度,不能繼續(xù)滑動,固定tableView的偏移量
            
            scrollView.contentOffset = CGPointMake(0, standardOffsetY)
            
            
            upperShouldScroll = true
            
        }else{
            
            upperShouldScroll = false
            
        }
        
        if upperShouldScroll != bottomShouldScroll {
            
            if !bottomShouldScroll && upperShouldScroll{
                
                NSNotificationCenter.defaultCenter().postNotificationName(goTopNotificationName, object: nil)
                
                shouldScroll = false
                
            }
            
            if bottomShouldScroll && !upperShouldScroll{
                
                if !shouldScroll{
                    
                    scrollView.contentOffset = CGPointMake(0, standardOffsetY)
                }
            }
        }
    }
  • innerTableView的代理方法
    func scrollViewDidScroll(scrollView: UIScrollView) {
        print(scrollView.contentOffset.y)
        
        if !shouldScroll {
            
            scrollView.setContentOffset(CGPointZero, animated: false)
            
        }
        
        if scrollView.contentOffset.y <= 0{
            
            NSNotificationCenter.defaultCenter().postNotificationName(leaveTopNotificationName, object: nil)
            
        }
    }

在代理方法中都發(fā)送了通知,自然需要對相應的通知進行監(jiān)聽了

  • tableView對通知的監(jiān)聽方法
    @objc private func changeScrollEnable(notification:NSNotification){
        
            shouldScroll = true
        
    }
  • innerTableView對通知的監(jiān)聽方法
    @objc private func changeScrollEnable(notification:NSNotification){
        
        
        let nameStr = notification.name
        
        if nameStr == goTopNotificationName{
            
                innerTableView.showsVerticalScrollIndicator = true
                
                shouldScroll = true
                
            
        }else if nameStr == leaveTopNotificationName{
            
            innerTableView.contentOffset = CGPointZero
            
            shouldScroll = false
            
            innerTableView.showsVerticalScrollIndicator = false
            
        }
    }

OK,關鍵代碼就這些,不足之處望簡友多多指教。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,315評論 4 61
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,297評論 3 38
  • 0x00序言 APPLE TV3這個盒子實在很雞肋,買回來后很少用到.官方限制太死了,不能裝app,也沒有辦法收看...
    gzr閱讀 7,026評論 0 2
  • 此時獨自坐在軒轅公園,享受著這點兒閑暇時光。內(nèi)心從焦慮的思緒,繁瑣的雜事兒中慢慢抽離,小憩一下,回歸到平靜,在當下...
    玉葉金枝閱讀 325評論 0 0
  • 姓名:張亞妮 公司:慈星股份 【知~學習】 《六項精進》大綱背誦1遍 共53遍 《活法》誦讀 《弟子規(guī)》誦讀...
    宇嘟嘟閱讀 161評論 0 0

友情鏈接更多精彩內(nèi)容