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

Posted

技术标签:

【中文标题】UIPageViewController - 双击点区域显示部分过渡(Xcode 8,Swift 3)【英文标题】:UIPageViewController - Double Tapping Dots Area Shows Partial Transition (Xcode 8, Swift 3) 【发布时间】:2016-11-11 17:31:42 【问题描述】:

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

双击示例:

我简化了一个 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
            
        

删除此代码后,没有部分过渡,但您现在会看到一个黑条,这也是不需要的。

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

这就是我要找的全部内容。一个解决方案:

在视图顶部显示点(无黑条) 过渡没有问题。

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

您可以使用Container View 将 UIPageViewController 嵌入其中,然后您可以保留不使用UIPageViewController 滚动的页面视图控制器的任何视图顶部

我希望这会有所帮助。

【讨论】:

【参考方案2】:

谢谢,杰。

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

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

【讨论】:

尝试使用pageControl.isUserInteractionEnabled = falsepageControl.isEnabled = false 来禁用页面控件的用户交互,而不是使用该hack。这行代码可能是您破解的解决方案。【参考方案3】:

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

【讨论】:

以上是关于UIPageViewController - 双击点区域显示部分过渡(Xcode 8,Swift 3)的主要内容,如果未能解决你的问题,请参考以下文章

如何从属于 UIPageViewController 的 UIViewController 之一更改 UIPageViewController?

UIPageViewController - 不符合协议

UIPageViewController 方向只向前

UIPageViewController 和 UIScrollView

NavigationController 中的 UIPageViewController

如何删除 UIPageViewController 中的 previousViewControllers