【问题标题】:UIPageViewController to present similar to a popover within main ViewUIPageViewController 呈现类似于主视图中的弹出框
【发布时间】:2018-06-05 17:47:48
【问题描述】:

在我的应用程序中,我想创建一个 用户故事(入职指南),这将是 3-4 叠可刷卡。用户可以轻扫并在最后一个被轻扫后,应用程序启动。用户也可以随时跳过她/他喜欢的。

下面和我想要的类似。

预期结果:

您的主视图显示在两侧。

我开始使用UIPageViewController 来管理这样的入职卡片,我成功地做到了。 (我有 3 个单独的视图 - 输入到我的自定义 UIPageViewController)。我还添加了小滑动点(您通常在此类入职堆栈底部看到的内容)。但是,由于最终我希望我的主视图位于此页面视图后面,因此我开始使用 tutorial 中建议的容器视图。我在主视图中拉入了一个 containerView,将它的控制器类作为我的自定义 PageViewController 类。

尽管我能够模仿我想要的,如下所示,我在自定义 UIPageViewController 中所做的大部分自定义都无法在此容器视图的控制器(现在是我的自定义 PageViewController)中使用。

实际结果:

我在自定义 UIPageViewController 中所做的自定义是: 1. 在底部滑动(或导航)点。 2. 这些点的颜色。 3. 背景颜色 4.我打算做更多的事情,比如把它的bounds改为RoundedRect等。

在属性检查器中探索时,以下是可在任何 UIPageViewController 中更改的属性:

UIPageViewController 的一般属性

下面是 Container 控制器的属性,它现在应该是 UIPageViewController 的子类,不是吗?如您所见,根本没有“页面视图控制器”部分。

我的自定义 UIPageViewController 的属性(Container 的 VC 不是它的子类)

所以,我一直在寻找两件事:

问题:

  1. 这是实现我想要的最佳方式吗? (我也在考虑使用 UIAlert 等来实现这一点,但决定反对它,因为我想要更多的控制权)。

  2. Container 的控制器有什么问题,在将其更改为 UIPageViewController 时,所有设置都变为默认设置。

我的首要任务是更好地了解我的第一个问题。指针肯定会有所帮助。非常感谢您的想法。

【问题讨论】:

    标签: ios swift uipageviewcontroller uicontainerview


    【解决方案1】:

    根据我的需要,这就是我能够做到的方式。详细添加,以防其他人受益。 我的主 ViewController 是我的入口点。在主 VC 中,我使用了 Container VC。我拖入了一个 UIPageViewController 并创建了三个 VC,它们将是我的 UIPageViewController 中的页面。我删除了 ContainerView 附带的默认控制器。并且实际上将 UIPageViewController 嵌入(Embed Segue)到 ContainerView(在主 VC 中)。 整个安排如下:

    这样我的 mainVC 可以保持初始 VC。我可以用圆角半径缩小我的三个视图,这看起来像一个弹出框排列,这正是我所需要的。我没有使用 UIPageViewController 使用的默认 UIPageControl。相反,我将 UIPageViewControl 拖到我的主 VC(而不是其中的容器 VC)上。通过这种方式,我能够添加在使用默认 UIPageControl 时可能无法添加的任何按钮(例如“Skip”)。这意味着,我没有在我的 UIPageViewController 代码中使用这些。

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

    为了控制我拖入的新 UIPageControl,我在我的 UIPageViewController 中引入了委托协议,并使我的主 VC 遵循该协议。然后,当用户滑动页面时,我基本上可以向我的主 VC(UIPageControl 是主 VC 中的一个出口)发送消息。

    protocol OnboardingViewControllerDelegate: class {
        func onboardingPageViewController(onboardingPageViewController: OnboardingViewController, didUpdatePageCount count: Int)
        func onboardingPageViewController(onboardingPageViewController: OnboardingViewController, didUpdatePageIndex index: Int)
    }
    

    最后,结果如下,这正是我想要的。如果有人想查看代码,请访问github

    编辑:在视图后面添加了阴影,因此更改了 gif。

    【讨论】:

      【解决方案2】:

      使用页面视图控制器可以实现您的目标 - 这将涉及为教程卡片创建一个具有清晰、半透明(非不透明)背景的视图控制器。

      您希望页面视图控制器填满整个屏幕,这样分页效果就不会被裁剪到教程卡片的边界。分页以及锁定滚动的方向将允许您有效地关闭您的卡片,直到没有更多可呈现。

      因此,与其使用容器视图,不如将页面视图控制器的背面去掉,并将显示设置为“Over Current Context”——这会使视图控制器可见。页面视图控制器将显示您配置的一系列教程卡片视图控制器。

      教程卡片视图控制器也将没有背景,但在视图的中心将是一个浮动卡片,其中包含您的文本和关闭按钮。将故事板的出口连接到您的自定义教程卡片视图控制器,以便您可以使用不同的文本配置多个实例。

      在此之后,请确保为视图控制器提供故事板标识符,以便在配置页面视图控制器数据源时对其进行实例化。创建您的教程卡片视图控制器数组并设置数据源以显示它们。

      我不会说这是最好的方法,因为市面上有很多“刷卡”包可以提供此功能等等,但对于 DIY 来说,这是一条可行的路线。

      【讨论】:

      • 谢谢卡勒姆。这实际上有效,并且随着运行时属性的变化,我实际上能够模仿我最初的预期。问题是:我的主要 VC 应该始终在后台。并且 PageView 和 2/3 视图应该在顶部。我确实更改了 PageViewController 下的三个视图的不透明度。这看起来不错的样子。我仍然看不到我的主 VC,因为我希望这些卡片出现,我已将 PageViewController 设置为初始视图控制器。如何将主 VC 设置为初始 ViewController 并将我的 PageViewController 的视图添加到其顶部?
      • 如果您要让主 VC 成为初始控制器,在 viewDidAppear 中,以模态方式在当前上下文中显示页面视图控制器。这可以通过 segue 界面构建器或通过将您要呈现的控制器的模态呈现类型设置为 .overCurrentContext 以编程方式完成。
      • 会试试看它是否有效。但是,我已经从您的回答中收到了我需要的大部分答案。在我试一试之后,我会接受这个作为答案。另外,可以理解的刷卡包很多并且可以使用。
      • 在下面的答案中,“黄色”是我的主要 VC。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      相关资源
      最近更新 更多