2016-11-11 20 views
2

雙人在頁控制區域(其中的點全部)的底部的任何地方攻絲暫停從一個視圖控制器到另一個的轉變。雙攻的UIPageViewController - 雙攻牙點區域顯示部分轉換(Xcode中8,夫特3)

Double tap area

例子:

Example 1Example 2

我簡化一個UIPageViewController項目,以證明這一點:

故事板 Storyboard

PageViewController.swift

import UIKit 

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    var pages: [UIViewController] = [UIViewController]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource = self 
     delegate = self 

     pages.append(UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Page1")) 
     pages.append(UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Page2")) 

     setViewControllers([pages.first!], direction: .forward, animated: true, completion: nil) 
    } 

    // This allows the dots to appear on top of the views 
    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 

     for view in self.view.subviews { 

      if view is UIScrollView { 
       view.frame = UIScreen.main.bounds 
      } else if view is UIPageControl { 
       view.backgroundColor = UIColor.clear 
      } 
     } 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     let viewControllerIndex = pages.index(of: viewController) 

     if viewControllerIndex == 1 { 
      return pages[0] 
     } 

     return nil 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     let viewControllerIndex = pages.index(of: viewController) 

     if viewControllerIndex == 0 { 
      return pages[1] 
     } 

     return nil 
    } 

    func presentationCount(for pageViewController: UIPageViewController) -> Int { 
     return pages.count 
    } 

    func presentationIndex(for pageViewController: UIPageViewController) -> Int { 
     return 0 
    } 
} 

問題的根源就在於此代碼:

// This allows the dots to appear on top of the views 
    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 

     for view in self.view.subviews { 

      if view is UIScrollView { 
       view.frame = UIScreen.main.bounds 
      } else if view is UIPageControl { 
       view.backgroundColor = UIColor.clear 
      } 
     } 

當該代碼被刪除不存在部分的過渡,但你現在會看到一個黑色的這也是不希望的。

blackbar

這是一個常見的解決方案,我發現整個網絡和#2獲得頁面控制(點)上展示的意見頂部而不是在屏幕底部自己的酒吧內。

所以這就是我要找的。一個解決方案:

  • 顯示上的意見頂部的點(沒有黑條)
  • 沒有問題轉變。

在此先感謝您的幫助!

回答

1

周杰倫,再次感謝您對我的幫助。我不知道你可以參考UIPageViewController中的UIPageControl,但我做了一些研究並找到了一種方法。我改變了viewDidLoad到這個,它的工作!沒有黑客需要:

override func viewDidLoad() { 
    super.viewDidLoad() 

    dataSource = self 
    delegate = self 

    setViewControllers([pages.first!], direction: .forward, animated: true, completion: nil) 

    let pageControl = UIPageControl.appearance(whenContainedInInstancesOf: [PageViewController.self]) 
    pageControl.isUserInteractionEnabled = false 
} 
1

謝謝,周杰倫。

對我來說容器視圖是最簡單的解決方案。我所做的就是用頁面底部的頁面控件(點)來隱藏背景顏色設置爲清除顏色的UIView。所以我阻止用戶在該區域雙擊。它完全感覺像是一個黑客,但我真的不想在你發佈的第二個鏈接中實現所有的自定義代碼。

enter image description here

然後我去https://bugreport.apple.com並要求Xcode的增強爲開發人員提供了一個複選框,以覆蓋在視圖,頁面控制或使用黑條的UIPageViewController。 :D

+2

而不是使用黑客也嘗試'pageControl.isUserInteractionEnabled = FALSE'或'pageControl.isEnabled = FALSE'禁用對您的網頁控制用戶交互。這一行代碼可能是你破解的解決方案。 – Jay