如何在iOS 12中构建页面

每当在手机中安装新的应用程序时,我们大多数人都不了解该应用程序的工作原理,其功能以及使用方法。 这些是登陆页面向我们介绍功能的完美时机。 登陆页面对于用户体验来说是很棒的和很酷的,但是当将虚拟内容显示为电子书时,登陆页面也非常有用。

我们使用哪些组件来构建页面?

  • UIPageViewController:页面导航的控制逻辑
  • PagesViewModel:适应页面模型
  • SinglePageModel:页面中的内容

1.构建我们的UIPageViewController

首先,我们将UIPageViewController子类化以提供自定义。 在这里,我们使用一个便利的初始化程序,该初始化程序允许我们设置水平或垂直滚动​​的页面。

 便利init(水平:布尔){如果水平{self.init(transitionStyle:.scroll,navigationOrientation:.horizo​​ntal,选项:无)}} else {self.init(transitionStyle:.scroll,navigationOrientation:.vertical,选项:nil) } self.viewModel = LandingViewModel()self.viewModel?.pages = self.defaultPageViewModels()self.pagesViewControllers = self.pageViewControllers(self.viewModel?.pages)}} 

ViewModel是在初始化期间与单个页面视图控制器一起设置的,其中单个页面视图控制器仅在情况下显示文本。 每个页面视图模型都是在defaultPageViewModels方法中创建的,该方法将内容存储在页面中。 这里没有提供视图模型和单页视图控制器的详细信息,因为它只是UIViewController。

为UIPageViewController提供多个Pages View Controllers时,有两种方法可以实现。 一种是通过setViewControllers一次给它一个这可能需要一个或两个UIViewController作为参数。 为了支持基于手势的导航,我们必须通过UIPageViewController数据源提供UIViewController。 数据源中有两种方法。

  • pageViewController(_,viewControllerAfter 🙂
  • pageViewController(_,viewControllerBefore 🙂

在第一个中,我们需要获取当前页面之后的下一个页面视图控制器。

 卫队让viewController = viewController为?  SinglePageVC,让index = pagesViewControllers.firstIndex(of:viewController)else {return nil} let nextIndex = index + 1guard pagesViewControllers.count> nextIndex else {return nil}返回pagesViewControllers [nextIndex] 

在第二个中,我们返回上一个页面视图控制器。

 卫队让viewController = viewController为?  SinglePageVC,让index = pagesViewControllers.firstIndex(of:viewController)else {return nil} let previousIndex = index-1guard previousIndex> = 0 else {return nil}返回pagesViewControllers [previousIndex] 

设置完所有这些之后,您应该能够交互UIPageViewController并使其前后滚动。

2. UIPageControl

UIPageViewController数据源有两个可选的委托方法,如果我们都实现,则将显示默认的页面指示符。

  • presentationCountForPageViewController:页面总数
  • presentationIndexForPageViewController:当前显示页面的索引

但是我们怎么知道索引呢?

通过使用willTransitionTo未决的ViewControllers和didFinishAnimating委托方法,我们可以跟踪索引。

当用户滚动到另一个页面时,将调用willTransitionTo 。 未决ViewController中的第一项将是页面。 我们将使用它来计算该页面的索引。 但是,在过渡完成之前,该索引可能不是当前索引。

 如果让未完成的页面= endingViewControllers.first作为?  PageViewController,let index = pagesViewControllers.firstIndex(of:endingPage){//将要显示的页面pendingIndex = index} 

当用户交互结束时, didFinishAnimating将被调用。 如果用户无法滚动到另一个页面,则完成的参数将为false,反之亦然。 下面的代码显示currentIndex仅在转移到另一个页面时才会更新。

 如果完成{//用户成功滚动到另一个页面currentIndex = endingIndex!} 

获取当前索引后,我们可以轻松地使用它们来显示默认页面指示符。

如果我们需要自定义页面指示符怎么办?

设置一个UIPageControl

  pageControl = UIPageControl.init()pageControl.currentPage = 0pageControl.numberOfPages = pagesViewControllers.countpageControl.currentPageIndicatorTintColor = .black 

您可能希望进行更多定制。 但最重要的是,我们需要确保指示器指向正确的页面。

pageControl.currentPage = currentIndex

这应该放在didFinishAnimating中。

瞧! 到目前为止,您应该已经可以使用一个简单的UIPageViewController了!

请继续关注iOS开发中的更多示例。