1. 程式人生 > IOS開發 >設計與Swipe-Delete不衝突的UIPageViewController

設計與Swipe-Delete不衝突的UIPageViewController

問題

當在UIPageViewController中新增UITableView時,如果:

  1. UITableView處在最右邊的vc中
  2. UITableView開啟了左滑刪除(Swipe-Delete)功能

那左滑刪除手勢和UIPageViewController的滾動手勢會有衝突,本文嘗試解決該問題,並分享了一個實現原始碼

對於手勢衝突的問題,我會想通過UIGestureDelegate的幾個方法來讓衝突的手勢協同工作。但UIPageViewController並沒有提供方法獲取或修改滾動手勢。於是我的解決方案就是:

自定義UIPageViewController,自己控制手勢

自定義UIPageViewController

初步設想用UIScrollView作為展示載體,這樣更容易實現左右滑動

由於UIScrollView本身的滾動手勢識別器--panGestureRecognizer由其內部控制,我們需要禁用掉。取而代之的是新增自定義的UIPanGestureRecognizer

手勢協同

當最右邊vc中有UITableView時,當左滑時,通過實現UIGestureRecognizerDelegatefunc gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool方法,使我們自己的panGestureRecognizer

不執行。以此來提高UITableView的左滑刪除手勢優先順序

管理Child ViewController

沒有自定義container viewcontroller經驗的話這一步很容易出錯

最初我的設計是,每往UIPageViewController新增一個vc,就將它的view新增到UIScrollView中,UIScrollView一直持有著這些vc

但後來經高人指點--這是不行的,因為

  1. child vc的生命週期可能因此混亂
  2. 原生的UIPageViewController是實時的獲取child vc,同一時間只會持有一個vc

基於上面的考慮,我在設計時

  • 模仿原生UIPageViewController,提供setViewController
    主動設定頁面和通過dataSource實時獲取下一個、上一個vc的方法
  • 在滾動過程中,通過當前位置等資訊,通過dataSource實時獲取chiild vc資料
  • 當完成一次child vc的完整展示後,及時釋放上一個展示的vc
  • 改用手動方式管理child vc的生命週期,完全模擬原生UIPageViewController

模擬UIPageViewController滾動體驗

  • 快速拖拽時,自動跳轉到相應頁面
  • 在最左、右頁面拖拽時的bounce效果

原始碼