Xcode XIB:如何实现ScrollView或PageControl来滑动子视图?

joe*_*son 6 xcode uiviewcontroller uiimageview uipageviewcontroller swift

我正在构建一个典型的Xcode 6 iOS应用程序.

我的目标是:

  • 具有可以滑动以更改内容的子区域的屏幕.

  • 例如,主屏幕具有徽标图像,我想要可刷卡的中间区域和底部按钮.

  • 当用户滑动(或点击)中间区域时,该区域显示下一个(或前一个)信息,这是典型的UIImage和UILabel标题.

  • 屏幕的其余部分保持不变,即没有导航更改.

代码在这里.它使用建议从StackOverflow的岗位在这里.

我的问题:如何在使用XIB的同时更好地实现下面的代码?

我当前的实现确实有效,并使用这种方法......

一个典型的Swift Demo.swift文件,它是一个UIViewController,它具有:

  • 页面索引,分钟和最大值
  • PageControl,UIImageView和UILabel的出口
  • 页面控件更改的操作以及图像滑动或点按

一个典型的Demo.xib文件:

  • 整个屏幕的典型UIViewController
  • UIImageView和UILabel用于可更改的图像和标题文本
  • 一个PageControl,用于指示用户正在查看的教程页面

我正在寻求更好的方法来实现这一目标; 我已经阅读了许多Xcode教程,到目前为止,Xcode 6,XIB和Swift似乎都没有.

以下是我研究过的一些看似有希望的实现......

有没有办法在XIB中实现子视图区域?

  • 例如,Xocde可以显示XIB的矩形区域是否适用于可更改的内容?

是否有一种惯用的方式来编写可变内容的代码?

  • 例如,通过使用ScrollView,可能包含UIPageViewController?

有没有办法使一个PageControl XIB对象足够大,覆盖整个UIImageView和UILabel,所以我可以跳过使UIImageView响应手势.

  • 在我的Xcode中,PageControl似乎有一个不可编辑的高度,总是37.

赏金将用于专家建议.

Yar*_*sim 2

要使 UIPageViewController 可滑动,您应该实现协议并为和方法UIPageViewControllerDataSource提供视图控制器。pageViewController(pageViewController:viewControllerBeforeViewController) -> UIViewController?...viewControllerAfterViewController)

为每个显示图像和标签的页面提供一个自定义视图控制器,并将它们作为属性,以便您可以从 PageViewController 提供它们。

我的技巧是创建一个在这些方法中实例化新视图控制器的方法:

// MARK:- UIPageViewControllerDataSource

extension MyPageViewController: UIPageViewControllerDataSource {

  func viewControllerWithIndex(var index: Int) -> UIViewController! {
    let viewController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController // This VC has to be in the storyboard, otherwise just use MyVC()

    // Adjust the index to be cyclical, not required
    if let count = data?.endIndex {
      if count == 1 && index != 0 { return nil }
      if index < 0 { index += count }
      index %= count
    }

    viewController.view.tag = index
    viewController.record = data?[index]

    return viewController
  }

  func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
    let index = viewController.view?.tag ?? 0
    return viewControllerWithIndex(index + 1)
  }

  func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    let index = viewController.view?.tag ?? 0
    return viewControllerWithIndex(index - 1)
  }

  func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int {
    return countAndSetupPageControl()
  }

  func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int {
    return viewController?.view.tag ?? 0
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,对于“子区域”,您需要实施一个ChildViewController. 如果您使用故事板,则只需拖动 aContainer View并将其放入PageViewController嵌入式视图控制器中,否则您需要将其添加PageViewController.view为子视图并将其设置frame为中间。

您可以在苹果文档中找到更多信息,但基本上您必须调用这些方法:

addChildViewController(pageViewController)
view.addSubView(pageViewController.view)
pageViewController.view.frame = ... // This is your "sub-area"
pageViewController.didMoveToParentViewController(self)
Run Code Online (Sandbox Code Playgroud)