UIPageViewController 在主视图中呈现类似于弹出窗口

UIPageViewController to present similar to a popover within main View

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

以下与我想要的相似。

预期结果:

您的主视图有点偏边。

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

尽管我能够模仿我想要的东西,如下所示,我在自定义 UIPageViewController 中所做的大部分自定义在这个 Container View 的控制器(现在是我的自定义 PageViewController).

实际结果:

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

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

UIPageViewController 的一般属性

下面是容器控制器的属性,现在实际上应该是 UIPageViewController 的子class,不是吗?如您所见,根本没有 "Page View Controller" 部分。

我的自定义 UIPageViewController 的属性(容器的 VC 不是它的子class)

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

问题:

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

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

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

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

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

因此,与其使用容器视图,不如将页面视图控制器的背面剥离,并将演示设置为 'Over Current Context' – 这使视图控制器可见。页面视图控制器将呈现一系列您配置的教程卡片视图控制器。

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

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

我不会说这是最好的方法,因为有许多 'swipeable card' 包可以提供此功能和更多功能,但为了 DIY,这是一个可行的途径。

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

这样我的mainVC就可以保持初始的VC。我可以使用圆角半径缩小我的三个视图,这看起来像弹出窗口排列,这正是我所需要的。我没有使用 UIPageViewController 使用的默认 UIPageControl。相反,我将 UIPageViewControl 拖到我的主 VC 上(而不是容器 VC 中)。这样,我就能够添加任何按钮(例如 "Skip"),这在使用默认 UIPageControl 时可能是不可能的。因此,我没有在我的 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。