2016-11-11 4 views
2

Двойное нажатие в любом месте нижней части области управления страницей (где точки) приостанавливает переход от одного контроллера представления к другому.UIPageViewController - Область двойного касания показывает частичный переход (Xcode 8, Swift 3)

Double tap area

Пример двойного постукивания:

Example 1Example 2

Я упрощена проект UIPageViewController, чтобы продемонстрировать это:

Storyboard 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

Это общее решение, которое я нашел по полотну и Stackoverflow, чтобы получить контроль страницы (точки), чтобы показать, на вершине взглядов, а не в своем собственном баре в нижней части экрана.

Вот и все, что я ищу. Решение, которое:

  • Показывает точки на верхней части взглядов (не черный бар)
  • Нет проблем с переходом.

Заранее благодарим за любую помощь!

ответ

1

Jay, еще раз спасибо за помощь в этом. Я не знал, что вы можете ссылаться на UIPageControl в UIPageViewController, но я сделал некоторые исследования и нашел способ. Я изменил 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

Существует очень хороший учебник How to Use UIPageViewController in Swift, который объясняет, как настроить UIPageViewController

Вторая часть этого учебника How to Move Page Dots in a UIPageViewController, который я считаю, это ответ на ваш вопрос.

Вы можете использовать Container View вставлять UIPageViewController в него, а затем вы можете сохранить любой вид верхней части контроллера вид страницы, не прокручивать с UIPageViewController

Я надеюсь, что это помогает.

1

Спасибо, Джей.

Для меня вид контейнера был самым простым решением. То, что я сделал, - это скрыть элемент управления страницами в нижней части страницы (точки) с UIView, в котором цвет фона установлен на четкий цвет. Поэтому я запрещаю пользователю двойное нажатие в этой области. Это абсолютно похоже на хак, но я, честно говоря, не хотел реализовывать весь этот код в этой второй ссылке, которую вы опубликовали.

enter image description here

Тогда я пошел в https://bugreport.apple.com и просил Enhancement Xcode для UIPageViewController, что дает разработчикам флажок для наложения контроля страницы над видом или использовать черную полосу. : D

+2

Вместо того, чтобы использовать этот хак сделал попробовать 'pageControl.isUserInteractionEnabled = false' или' pageControl.isEnabled = false' отключить взаимодействие с пользователем для управления страницами. Эта одна строка кода может быть решением для вашего взлома. – Jay