UIPageViewController - 双击点区域显示部分过渡(Xcode 8,Swift 3)

UIPageViewController - Double Tapping Dots Area Shows Partial Transition (Xcode 8, Swift 3)

双击页面控制区域底部的任意位置(点所在的位置)会暂停从一个视图控制器到另一个视图控制器的转换。

双击示例:

我简化了一个 UIPageViewController 项目来演示这一点:

故事板

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
            }
        }

删除此代码后,将不会出现部分过渡,但您现在会看到同样不需要的黑条。

这是我在整个网络和 Whosebug 上找到的一个常见解决方案,可以让页面控件(点)显示在视图顶部,而不是在屏幕底部自己的栏中。

这就是我要找的。一个解决方案:

在此先感谢您的帮助!

有非常好的教程 How to Use UIPageViewController in Swift 解释了如何配置 UIPageViewController

本教程的第二部分 How to Move Page Dots in a UIPageViewController 我相信这是您问题的答案。

您可以使用 Container View 将 UIPageViewController 嵌入其中,然后您可以将任何不随 UIPageViewController

滚动的视图保持在页面视图控制器的顶部

希望对您有所帮助。

谢谢杰伊

对我来说,容器视图是最简单的解决方案。我所做的是用背景颜色设置为清晰颜色的 UIView 覆盖页面底部的页面控件(点)。所以我阻止用户在该区域双击。这完全感觉像是一个 hack,但老实说,我不想在你发布的那一秒 link 实现所有自定义代码。

然后我去了 https://bugreport.apple.com 并请求了 UIPageViewController 的 Xcode 增强功能,它为开发人员提供了一个复选框来覆盖视图上的页面控件或使用黑条。 :D

Jay,再次感谢你帮助我解决这个问题。我不知道您可以在 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
}