在两个 UIViewController 的视图之间滑动

Posted

技术标签:

【中文标题】在两个 UIViewController 的视图之间滑动【英文标题】:Swipe between two UIViewControllers' views 【发布时间】:2013-08-04 20:41:28 【问题描述】:

我知道我已经多次问过这个问题,但我非常缺乏经验,并且认为我还没有得到正确的答案。

我现在有两个视图控制器,每个控制器都有一个 .h 文件、一个 .m 文件和一个 .xib 文件。在这两个 .xib 文件中,我都有一个 UIView。我怎样才能使您可以在这两个视图之间滑动?例如,应用程序在第一个视图上打开,然后从右向左滑动,下一个视图出现。我希望在浏览照片时滑动的动画与照片应用程序的动画一样。

【问题讨论】:

【参考方案1】:

虽然您可以自己实现这一点(custom container view controller 与 UIPanGestureRecognizerUIScrollView 结合使用),但如果使用 ios 6 及更高版本,最简单的方法是使用带有“滚动”过渡样式的 Page View Controller .

考虑这个故事板:

它由一个页面视图控制器和两个页面的两个场景组成。第 1 页的故事板标识符为 one,基类为 PageOneViewController。第 2 页的故事板标识符为 two,基类为 PageTwoViewController

然后我写了一个UIPageViewController 子类(也许很明显,这是我为上面故事板的第一个场景指定的类),它具有以下代码:

- (void)viewDidLoad

    [super viewDidLoad];

    self.dataSource = self;

    [self setViewControllers:@[[self.storyboard instantiateViewControllerWithIdentifier:@"one"]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController

    if ([viewController isKindOfClass:[PageOneViewController class]])
        return nil;

    return [self.storyboard instantiateViewControllerWithIdentifier:@"one"];


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

    if ([viewController isKindOfClass:[PageTwoViewController class]])
        return nil;

    return [self.storyboard instantiateViewControllerWithIdentifier:@"two"];

您也可以使用 NIB 执行此操作,但需要编写更多代码。如果您搜索UIPageViewController XIB,您可能会得到一些点击。

如果您需要支持 6.0 之前的 iOS 版本,则必须使用平移手势或滚动视图执行自定义容器方法。

【讨论】:

【参考方案2】:

有很多正确的方法可以丰富你的目标。

例如:

1) 从 iOS 6 开始,您可以使用 UIPageViewController 和 transitionStyle 属性 UIPageViewControllerTransitionStyleScroll

2) 您可以将UIScrollViewpagingEnable = YES; 属性一起使用,并在其中添加您的视图。您还需要实现所有容器方法addChildViewController:removeFromParentViewControllerwillMoveToParentViewController:didMoveToParentViewController: 来处理控制器的出现/消失方法

3) 您可以找到第三方解决方案,例如:

TTScrollSlidingPagesController PagerViewController

【讨论】:

您能帮我解决一下滚动视图选项吗?正如我所说,我对 Objective-C 不是很好,所以我真的不知道我在做什么。你能写一些我如何实现 UIScrollView 的示例代码吗?同样,正如我之前所说,我有两个视图控制器(我不知道这是否正确),每个控制器内部都有一个视图。谢谢!如果您需要,请询问更多信息! 网上有很多教程和示例:raywenderlich.com/10518/…eureka.ykyuen.info/2010/05/22/…gabriel-tips.blogspot.com/2012/02/…iosdevnotes.com/2011/03/uiscrollview-paging @user2397282 Flop 给了你很多优秀的链接。您应该浏览其中的一些(如果不是全部)并真正了解它们是如何工作的。如果您花时间通过其中一些链接来研究您的问题,您会发现解决问题的好方法。【参考方案3】:

这是一个很好的回购:

https://github.com/goktugyil/EZSwipeController

您基本上需要一个 UIPageViewController 并将您的 ViewControllers 放入其中。

【讨论】:

【参考方案4】:

你可以使用这个 repo。它对于 RnD 来说非常简单易懂。 (Swift 3 代码)

https://github.com/lakshikabhardwaj/LBViewControllerCollection

     let mainViewController = CPPageMenuVC(nibName: "CPPageMenuVC", bundle: nil)
      let pageMenuarray :[PageModal] = [PageModal(pageTitle: "Cat", pageVC: cpCatVC),PageModal(pageTitle: "Cow", pageVC: cowCX),PageModal(pageTitle: "Chat", pageVC: cpCatVC),PageModal(pageTitle: "ElephantElephant", pageVC: elephantVC)]

      pageMenuVC.pageArray = pageMenuarray
      pageMenuVC.tabHeight = 0    // WITHOUT TOPICS

【讨论】:

以上是关于在两个 UIViewController 的视图之间滑动的主要内容,如果未能解决你的问题,请参考以下文章

一个 UIViewController 中的两个 UICollectionView

如何创建一个 UIViewController 具有两个视图,根据单击的按钮显示一个或另一个

将两个 UIViewController 并排放在屏幕上

将对象传递给 UIViewController 的子视图

错误 UIViewController 没有成员

在一个 UIVIewController 中有两个垂直的全屏 UIViews?