处理用任何一种方式滑动的视图控制器

我正在构build一个适用于iOS6 +的应用程序。 该应用程序将在应用程序中的一个点上有一个主视图控制器。

我想这个主视图控制器处理一个左滑动,并在屏幕上向右滑动,然后显示另一个视图控制器。

是否有一个简单的方法来完成这个核心的iOS6 +,或者我应该寻找另一个库等

我已经在应用程序的其他地方使用了菜单样式的幻灯片。 我也明白,可以find一百万个替代品。

我正在寻找的是有一个视图控制器(在“中间”行事)。 然后,当他们左/右滑动另一个视图控制器显示。 然后,他们可以向相反方向滑动,或单击后退button返回到主控制器。

编辑-
具体来说,我正在寻找function来执行以下操作:预加载将滑入的控制器。当发生滑动(正在发生)…控制器通过触摸拖动/滑动。 同样的拖动/滑动发生的任何一种方式控制器被刷(左/右)。

编辑2 –
我正在寻找用手指拖动视图控制器的function。 取决于拖动的发生方式,它将拉动相同的视图控制器。

即布局将是:[用于拖动的VC] [主控制器] [用于拖动的VC]。
如果用户从左到右或从右到左滑动,则另一个控制器被拖动到顶部,并且可以使用相反的条目滑动返回到主控制器。

我最喜欢的抽屉控制器: https : //github.com/mutualmobile/MMDrawerController

MMDrawerController是高度可configuration的,可以完成所有你提到的事情:

  • 支持左右控制器
  • 预加载侧控制器
  • 用手势“拖”开

如果您使用的是故事板,则可以使用此扩展来创build故事板支持: https : //github.com/TomSwift/MMDrawerController-Storyboard

编辑:

另一种select可能是使用带有UIPageViewController转换风格的UIPageViewControllerTransitionStyleScroll : https : //developer.apple.com/library/ios/documentation/uikit/reference/UIPageViewControllerClassReferenceClassRef/UIPageViewControllerClassReference.html

这将在侧视图控制器中具有“拉”的行为而不是“揭露”它们。

编辑2:每个请求的示例

您唯一真正复杂的要求是左侧和右侧使用相同的视图控制器。 这意味着我们必须跟踪视图控制器的呈现位置,以便我们能够正确pipe理我们的数据源。 如果没有这个要求,我们可以用一个数组来返回数据源,并从那里得到next / prev。

首先,故事板。 故事板上有三个视图控制器:1) UIPageViewController ,我把它分类为TSPageViewController 。 不要忘记将页面控制器转换样式属性设置为“滚动”。 2)“中心”视图控制器,以及3)“侧面”视图控制器。 对于中心和侧面,我已经分别将每个的故事板ID设置为“中心”和“边”。 对于这个示例,中间和侧面控制器都是普通的香草UIViewControllers ,我已经设置他们的视图backgroundColor告诉他们分开。

在这里输入图像说明

其次,页面视图控制器:

。H

 @interface TSPageViewController : UIPageViewController @end 

.M

 @interface TSPageViewController () <UIPageViewControllerDataSource> @end @implementation TSPageViewController { UIViewController* _side; UIViewController* _center; } - (void) viewDidLoad { [super viewDidLoad]; self.dataSource = self; _side = [self.storyboard instantiateViewControllerWithIdentifier: @"side"]; _center = [self.storyboard instantiateViewControllerWithIdentifier: @"center"]; [self setViewControllers: @[_center] direction: UIPageViewControllerNavigationDirectionForward animated: NO completion: nil]; } - (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if ( viewController == _center ) { _side.title = @"right"; return _side; } if ( viewController == _side && [_side.title isEqualToString: @"left"] ) { return _center; } return nil; } - (UIViewController*) pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if ( viewController == _center ) { _side.title = @"left"; return _side; } if ( viewController == _side && [_side.title isEqualToString: @"right"] ) { return _center; } return nil; } @end 

同样,这里唯一特别的是追踪侧面控制器当前是“左”还是“右”。 这个实现有一个问题,它依赖于UIPageViewController的行为,而不是“向前翻页”和caching视图控制器(如果这样做,我们的逻辑会感到困惑)。 所以你可能想要考虑一个更强大的机制来跟踪视图控制器当前在哪一边。 为此,您可能必须引入自己的滑动手势识别器,并使用其中的数据来驱动左/右跟踪。

如果你可以左右使用相同的视图控制器的要求,那么你可以有分开的左/右/中心控制器,存储在一个数组中,并根据你在数组中看到的返回下一个/上一级控制器。 更容易,更强大!

对于iOS6 +:

我倾向于使用https://github.com/pkluz/PKRevealController ,只需将左右视图控制器设置为指向单个viewController的指针。


对于iOS7 +:

我想你应该看看自定义的UIViewController转换。

https://github.com/ColinEberhardt/VCTransitionsLibrary

http://www.teehanlax.com/blog/custom-uiviewcontroller-transitions/

有关此主题的“使用视图控制器进行自定义转换”的WWDC 2013video很好,这是第218次会议。

你可以使用一些cocoa控件来完成这个任务,比如:

https://github.com/Inferis/ViewDeck

https://github.com/gotosleep/JASidePanels

编辑:build议二号,使用scrollView控制器:

 // Allocate all the controlelrs you need MyFirstViewController *first = [[MyFirstViewController alloc] init]; MySecondViewController *second= [[MySecondViewController alloc] init]; MyThirdViewController *third = [[MyThirdViewController alloc] init]; // Adjust the frames of the controllers first.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); second.view.frame = CGRectMake(0, self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height); third .view.frame = CGRectMake(0, 2 * self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height); // Add controllers as subViews to the scrollView [self.scrollView addSubview:self.first.view]; [self.scrollView addSubview:self.second.view]; [self.scrollView addSubview:self.third.view]; // Set the scrollView contentSize and paging self.scrollView.contentSize = CGRectMake(self.view.frame.size.width * 3, self.view.frame.size.height); self.scrollView.pagingEnabled = YES; // Scroll to the middle view initally [self.scrollView scrollRectToVisible:CGRectMake(0, self.view.frame.size.width, self.view.frame.size.width, self.view.frame.size.height) animated:NO]; 

上面的代码是用心写的,我可能错误地指出了一些东西,并且有不止一种方式来处理子视图。 在注释中提到的pageViewController也可以。

听起来像UISwipeGestureRecognizer的工作。

你正在寻找的东西听起来很像Apple的UIPageControl Demo的iPhone版本;