設計與Swipe-Delete不衝突的UIPageViewController
阿新 • • 發佈:2019-12-25
問題
當在UIPageViewController中新增UITableView時,如果:
- UITableView處在最右邊的vc中
- UITableView開啟了左滑刪除(Swipe-Delete)功能
那左滑刪除手勢和UIPageViewController的滾動手勢會有衝突,本文嘗試解決該問題,並分享了一個實現原始碼
對於手勢衝突的問題,我會想通過UIGestureDelegate的幾個方法來讓衝突的手勢協同工作。但UIPageViewController並沒有提供方法獲取或修改滾動手勢。於是我的解決方案就是:
自定義UIPageViewController,自己控制手勢
自定義UIPageViewController
初步設想用UIScrollView
作為展示載體,這樣更容易實現左右滑動
由於UIScrollView本身的滾動手勢識別器--panGestureRecognizer
由其內部控制,我們需要禁用掉。取而代之的是新增自定義的UIPanGestureRecognizer
手勢協同
當最右邊vc中有UITableView時,當左滑時,通過實現UIGestureRecognizerDelegate
的func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool
方法,使我們自己的panGestureRecognizer
管理Child ViewController
沒有自定義container viewcontroller經驗的話這一步很容易出錯
最初我的設計是,每往UIPageViewController新增一個vc,就將它的view新增到UIScrollView中,UIScrollView一直持有著這些vc
但後來經高人指點--這是不行的,因為
- child vc的生命週期可能因此混亂
- 原生的UIPageViewController是實時的獲取child vc,同一時間只會持有一個vc
基於上面的考慮,我在設計時
- 模仿原生UIPageViewController,提供
setViewController
- 在滾動過程中,通過當前位置等資訊,通過dataSource實時獲取chiild vc資料
- 當完成一次child vc的完整展示後,及時釋放上一個展示的vc
- 改用手動方式管理child vc的生命週期,完全模擬原生UIPageViewController
模擬UIPageViewController滾動體驗
- 快速拖拽時,自動跳轉到相應頁面
- 在最左、右頁面拖拽時的bounce效果