Xcode XIB : how to implement a ScrollView or PageControl to swipe sub-views?

标签 xcode swift uiviewcontroller uiimageview uipageviewcontroller

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

我的目标是:

  • 具有子区域的屏幕,可以通过滑动该区域来更改内容。

  • 例如,主屏幕有一个 Logo 图像、一个我希望可滑动的中间区域和一个底部按钮。

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

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

密码是here .它使用 StackOverflow 帖子中的建议 here .

我的问题:如何在仍然使用 XIB 的情况下更好地实现下面的代码?

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

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

  • 页面索引、最小值和最大值
  • PageControl、UIImageView 和 UILabel 的 socket
  • 页面控件变化、图像滑动或点击的 Action

一个典型的 Demo.xib 文件有:

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

我正在寻找更好的方法来实现这一目标;我已经阅读了许多 Xcode 教程,但到目前为止,似乎没有一个是 Xcode 6、XIB 和 Swift 的权威教程。

以下是我研究过的一些看起来很有前途的实现...

有没有办法在 XIB 中实现 subview 区域?

  • 例如,Xocde 是否可以用一个矩形区域显示 XIB,该区域用于可变内容?

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

  • 例如,通过使用 ScrollView,也许它包含一个 UIPageViewController?

有没有办法让 PageControl XIB 对象足够大以覆盖整个 UIImageView 和 UILabel,这样我就可以跳过让 UIImageView 响应手势。

  • 在我的 Xcode 中,PageControl 似乎有一个不可编辑的高度,它始终为 37。

赏金将征求专家意见。

最佳答案

要使 UIPageViewController 可滑动,您应该实现 UIPageViewControllerDataSource 协议(protocol)并为 pageViewController(pageViewController:viewControllerBeforeViewController) -> UIViewController? 提供一个 View Controller code>...viewControllerAfterViewController) 方法。

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

我的技巧是创建一个在这些方法中实例化新 View Controller 的方法:

// 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。如果您使用的是 Storyboard,您只需拖动一个 Container View 并将 PageViewController 放入嵌入式 View Controller 中,否则您需要添加 PageViewController.view 作为 subview 并将 frame 设置到中间。

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

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

关于Xcode XIB : how to implement a ScrollView or PageControl to swipe sub-views?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664015/

相关文章:

iphone - NSDictionary 到 XML

JSON 请求并不总是返回相同的响应类型(对象和数组)

ios - 如何访问 XCUIApplication 中设置的 launchEnvironment 和 launchArguments,在 XCode 中运行 UI 测试?

ios - 转到新的 UIViewController 时如何从层次结构中删除 UIViewController?

objective-c - 无法从一个特定屏幕问题导航仅在 iOS 11 中

ios - 显示其 View 不在窗口层次警告中

iOS 自定义字体显示在模拟器上,但不显示在设备上

ios - 当主线程使用量增加时,IOS音频线程CPU使用率下降

ios - swift4 : how to check if user logged befor tab bar item clicked

ios - 如何在 Swift 中从其 ViewController 获取 UIView 子类实例