【问题标题】:Setting up UIScrollView to swipe between 3 view controllers设置 UIScrollView 在 3 个视图控制器之间滑动
【发布时间】:2013-11-18 05:06:37
【问题描述】:

我正在尝试设置 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 *'”。

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

基本上,我只想让整个屏幕成为一个滚动视图,让我可以在我的 3 个视图控制器之间滑动。我该怎么做呢?

【问题讨论】:

  • Wenderlich 在 UIImageView 上有一个类似的教程。尝试更改 UIImageView 并改用 UIViewControllers。 raywenderlich.com/10518(在 Paging with UIScrollView 下)
  • @Anil,显然情况并非如此,因为您应该考虑父子视图控制器层次结构。

标签: ios objective-c swift xcode uiscrollview


【解决方案1】:

UPD:2015 年 6 月 斯威夫特

这个概念保持不变,这在下面的 Objective-C 部分中进行了描述。语法有一点变化。要添加 childviewcontroller,请使用以下 sn-p:

let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController;

addChildViewController(aViewController);
scrollView!.addSubview(aViewController.view)
aViewController.didMoveToParentViewController(self)

查看我的Swift Github Sample Code

Objective-C

创建您自己的自定义容器视图控制器(我将其称为combinedViewController),它将在滚动视图中保存您的三个控制器。 像往常一样继承 UIViewController,然后在新的 combineViewController -viewDidLoad: 中使用 addChildViewController 公共 API,如下所示:

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

代码的作用如下:

  • 它调用容器的 addChildViewController: 方法来添加孩子。
  • 它访问子视图属性以检索视图并将其添加到自己的视图层次结构中。容器在添加视图之前设置孩子的大小和位置;容器始终选择子内容的显示位置。
  • 它显式调用孩子的 didMoveToParentViewController: 方法来表示操作已完成。

对每个视图控制器执行此操作。之后,将您的 combineViewController 设置为 rootViewController。

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

参考:Design custom container view controller

你是我的Objective-C Github sample code

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

结果:

【讨论】:

  • 非常感谢您的回答,但我有点迷茫;我对Objective-C真的很陌生,而且我还在学习。我创建了一个新的视图控制器并导入了我的 3 个视图控制器的头文件。我尝试复制您的代码,并用 BarsViewController 替换 aViewController,但它说,“没有已知的选择器 'willMovetoViewController:' 的类方法”,以及所有行上的其他不同错误。那是我应该做的吗?对此感到抱歉。
  • 对不起,我的错误,你应该写-willMoveToParentViewController:
  • 这行得通!非常感谢您所付出的所有努力!!你太棒了!!!
  • 感谢您制作 github 示例代码 - 非常有帮助!
  • @jjatie 有时您不想拥有一个完整的视图控制器,而只想在另一个视图控制器内的滚动视图中启用分页。
【解决方案2】:
    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)

【讨论】:

    【解决方案3】:

    Swift 3.0

    基于 Sachin 的回答 - 更通用 - 只需将下一个元素添加到视图数组

    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)
    }
    

    【讨论】:

      【解决方案4】:

      试试这个 git repo,使用这个 repo,你可以创建一个视图导航,比如 Snapchat/Tinder Main Pages。

      https://github.com/goktugyil/EZSwipeController

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多