代码之家  ›  专栏  ›  技术社区  ›  BigMountainStudio.com

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

  •  2
  • BigMountainStudio.com  · 技术社区  · 8 年前

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

    Double tap area

    双攻丝示例:

    Example 1 Example 2

    故事板 Storyboard

    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

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

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

    • 显示视图顶部的点(无黑条)
    • 转换没有问题。

    提前感谢您的帮助!

    3 回复  |  直到 8 年前
        1
  •  1
  •   Jay    8 年前

    有非常好的教程 How to Use UIPageViewController in Swift 这说明了如何配置 UIPageViewController

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

    你可以使用 Container View 若要在其中嵌入UIPageViewController,则可以将任何视图保持在页面视图控制器的顶部,该视图不会随一起滚动 UIPageViewController

    我希望这有帮助。

        2
  •  1
  •   BigMountainStudio.com    8 年前

    谢谢,杰伊。

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

    enter image description here

    然后我去了 https://bugreport.apple.com 并请求对UIPageViewController进行Xcode增强,使开发人员可以使用复选框将页面控件覆盖在视图上或使用黑条:D

        3
  •  1
  •   BigMountainStudio.com    8 年前

    杰伊,再次感谢你在这方面的帮助。我不知道您可以在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
    }