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)
所以,我一直在寻找两件事:
问题:
这是实现我想要的最好方法吗? (我也考虑过使用 UIAlert 等来实现这一点,但决定反对它,因为我想要更多的控制权)。
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。
在我的应用程序中,我想创建一个 用户故事(入职指南),这将是 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)
所以,我一直在寻找两件事:
问题:
这是实现我想要的最好方法吗? (我也考虑过使用 UIAlert 等来实现这一点,但决定反对它,因为我想要更多的控制权)。
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。