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

问题描述 投票:4回答:2

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

以下类似于我想要的。

预期结果:

enter image description here

您可以在主视图两侧显示一些内容。

我开始使用UIPageViewController管理这样的登机牌,我成功地做了。 (我有3个单独的视图 - 这些视图提供给我的自定义UIPageViewController)。我还添加了一个小的刷卡点(你通常在这种入门堆栈的底部看到的)。但是,由于最终我希望我的主视图在此页面视图后面,我开始使用这个tutorial中建议的容器视图。我在主视图中引入了一个containerView,使得它的控制器类成为我自定义的PageViewController类。

虽然我能够模仿我想要的东西,如下所示,我在自定义UIPageViewController中进行的大多数自定义都无法在此Container View的控制器(现在是我的自定义PageViewController)中使用。

实际结果:

enter image description here

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

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

一般来说,UIPageViewController的属性

enter image description here

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

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

enter image description here

所以,我正在寻找两件事:

问题:

  1. 这是实现我想要的最佳方式吗? (我也在考虑使用UIAlert等实现这个目标,但我决定反对它,因为我想要更多的控制权)。
  2. Container的控制器有什么问题,在将其更改为UIPageViewController时,所有设置都将变为默认值。

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

ios swift uipageviewcontroller uicontainerview
2个回答
1
投票

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

您希望页面视图控制器填满整个屏幕,因此分页效果不会被裁剪到教程卡的边界。分页以及锁定滚动的方向将允许您有效地解除您的卡片,直到不再存在。

因此,不是使用容器视图,而是将页面视图控制器的背面剥离出来,并将演示文稿设置为“Over Current Context” - 这会使视图控制器隐藏在后面。页面视图控制器将显示您配置的教程卡视图控制器阵列。

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

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

我不会说这是最好的方式,因为有许多“可刷卡”包提供了这个功能和更多,但为了DIY,这是一个可行的路线。


4
投票

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

enter image description here

这样我的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

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.