设置UIScrollView在3个视图控制器之间滑动

我想build立一个UIScrollView,以便我可以在3个视图控制器之间滑动。 这是我在AppDelegate.m中的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch.; UIScrollView *sv = [[UIScrollView alloc] init]; BarsViewController *bvc = [[BarsViewController alloc] init]; // Create BarsViewController StopwatchViewController *svc = [[StopwatchViewController alloc] init]; // Create StopwatchViewController TimerViewController *tvc = [[TimerViewController alloc] init]; // Create TimerViewController [sv addSubview:bvc.view]; [sv addSubview:svc.view]; [sv addSubview:tvc.view]; [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; // Hide status bar self.window.rootViewController = sv; [self.window makeKeyAndVisible]; return YES; } 

它给这条线上的错误:

 self.window.rootViewController = sv; 

说:“从UIScrollView *'”分配给'UIViewController *'的指针types不兼容。

但是,没有像UIScrollViewController这样的东西,所以我不知道该怎么做。

基本上,我只是希望整个屏幕是一个滚动视图,这使我可以在我的3个视图控制器之间滑动。 我将如何去做呢?

UPD:2015年6月 Swift

这个概念保持不变,下面在Objective-C部分中进行描述。 语法有一些变化。 要添加childviewcontroller使用下面的代码片段:

 let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController; addChildViewController(aViewController); scrollView!.addSubview(aViewController.view) aViewController.didMoveToParentViewController(self) 

检查我的Swift Github示例代码

Objective-C的

创build你自己的自定义容器视图控制器(我将其称为combinedViewController),它将把你的三个控制器放在滚动视图中。 inheritance像你总是做UIViewController,然后使用addChildViewController公共API在你的新的combinedViewController -viewDidLoad:像这样:

 [self addChildViewController:aViewController]; [self.scrollView addSubview:aViewController.view]; [aViewController didMoveToParentViewController:self]; 

代码如下:

  • 它调用容器的addChildViewController:方法来添加子项。
  • 它访问子视图属性来检索视图并将其添加到其自己的视图层次结构中。 容器在添加视图之前设置孩子的大小和位置; 容器总是select孩子的内容出现的地方。
  • 它明确地调用孩子的didMoveToParentViewController:方法来表示操作已完成。

对每个viewControllers执行此操作。 之后,将您的combinedViewController设置为rootViewController。

如果您需要进一步解释,请随时询问。

参考: devise自定义容器视图控制器

这里你是我的Objective-C Github示例代码

UPD:感谢@Oliver Atkinson澄清addChildViewController:方法也自动调用孩子的willMoveToParentViewController:方法。

结果:

在这里输入图像说明

试试这个git回购,使用这个回购你可以创build一个像Snapchat / Tinder主页的视图导航。

https://github.com/goktugyil/EZSwipeController

  let obj1 = self.storyboard?.instantiateViewControllerWithIdentifier("DocumentsVC") as! DocumentsVC let obj2 = self.storyboard?.instantiateViewControllerWithIdentifier("AppointmentsVC") as! AppointmentsVC let obj3 = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardVC") as! DashboardVC self.containerScrollView.frame = obj2.view.frame self.containerScrollView.addSubview(obj2.view) obj2.willMoveToParentViewController(self) self.addChildViewController(obj2) self.containerScrollView.addSubview(obj1.view) obj1.willMoveToParentViewController(self) self.addChildViewController(obj1) self.containerScrollView.addSubview(obj3.view) obj3.willMoveToParentViewController(self) self.addChildViewController(obj3) self.containerScrollView.contentSize = CGSizeMake(3*UIScreen.mainScreen().bounds.width, 0) obj1.view.frame.origin = CGPointMake(0, 0) obj2.view.frame.origin = CGPointMake(UIScreen.mainScreen().bounds.width, 0) obj3.view.frame.origin = CGPointMake(2*UIScreen.mainScreen().bounds.width, 0) 

Swift 3.0

基于萨钦答案 – 更通用 – 只需添加到视图数组的下一个元素

 var views = [ViewController(), ViewController2(), ViewController3(), ViewController4()] func setupScrollView() { scrollView.frame = views.first!.view.frame scrollView.contentSize = CGSize(width: CGFloat(views.count) * width, height: 0) _ = views.map({ addViewToScrollView($0) }) _ = views.map({ $0.view.frame.origin = CGPoint(x: CGFloat(views.index(of: $0)!) * width, y: 0) }) } func addViewToScrollView(_ viewController: UIViewController) { scrollView.addSubview(viewController.view) views.willMove(toParentViewController: self) addChildViewController(viewController) }