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

时间:2015-04-16 01:50:56

标签: xcode swift uiviewcontroller uiimageview uipageviewcontroller

我正在构建一个典型的Xcode 6 iOS应用。

我的目标是:

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

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

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

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

代码为here。它使用StackOverflow帖子here中的建议。

我的问题:如何在使用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。

赏金将用于专家建议。

2 个答案:

答案 0 :(得分: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
  }
}

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

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

addChildViewController(pageViewController)
view.addSubView(pageViewController.view)
pageViewController.view.frame = ... // This is your "sub-area"
pageViewController.didMoveToParentViewController(self)

答案 1 :(得分:1)

如果您向PageControl添加高度约束,您可以将其高度设置为您想要的任何高度。

我没有看到您当前实施的问题。将其更改为使用PageViewController将会更加有效。

如果我是你,我会在pageUpdate函数中添加动画,以便图像淡入或滑入...

如果您希望能够滚动到下一页(就像在手指在屏幕上移动的同时移动内容一样),那么使用PageViewController是有意义的。您可以使用PageViewController或CollectionView启用分页。