【问题标题】:Horizontal UIScrollView with infinite loop in swift快速无限循环的水平UIScrollView
【发布时间】:2016-03-21 02:57:31
【问题描述】:

如何为水平UIScrollView 制作无限循环视图?

Example of what I want

假设我有一个集合var subViews = [1,2,3,4,5,6]。我想用这个集合创建UIScrollView

for subview in subViews {
   uiscrollview.addSubview(subview)
}

但我不想用该集合中的所有项目填充我的ScrollView。它应该只有三个项目,总是像 [1,2,3][2,3,4][5,6,1]

我找到了this library,但它的 Objective-C。

提前致谢。

更新:

 let page = Int(floor((pageScrollView.contentOffset.x * 2.0 + pageWidth) / (pageWidth * 2.0)))

    let firstPage = page - 1
    let lastPage = page + 1

        for index in 0..<subViews.count{
            let subview = subViews[index]
            if index != firstPage || index != lastPage {
                subview.removeFromSuperview()
                subpageViewControlls[index] = nil
            }
        }

【问题讨论】:

  • 您可以通过添加桥头来快速使用objective-c库。看到这个:developer.apple.com/library/ios/documentation/Swift/Conceptual/…
  • 谢谢,但我已经用 ScrollView Delegate 做了很多事情,所以现在我不能切换到这个 Objective-C 类。我只需要像那个objective-c lib一样的逻辑/算法。
  • 如果我是你,我会三思而后行。 UIPageViewController 完全符合您的要求,但看起来您已经编写了代码来挂钩其他内容。您可能会发现重构代码以使用库(这可能意味着 Objective-C)或 UIPageViewController 会更容易,然后只需找到一种不同的方式来完成“使用 ScrollView 委托做很多事情”。跨度>
  • 请查看此截屏视频link,我认为这不可能与UIPageViewController(顶部导航)有关
  • 我正在阅读您的更新代码。乘以 2.0 是怎么回事?我认为您应该考虑使用 Xcode 的视图调试来准确查看您的视图的去向。

标签: ios swift loops uiscrollview infinite


【解决方案1】:

这里有几个选项。首先,像iCarousel 这样的东西可以让你很容易地创建无限循环的视图——你只需告诉它你希望如何配置每个视图,你就完成了。我建议这是方便和可维护性的首选解决方案。

第二种解决方案是使用UIPageViewController 来处理页面之间的滑动,但这需要您自己实现循环。感谢UIPageViewController 的实现方式,这很简单:只需确保在这两个中使用模数或类似的:

pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController)
pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController)

这两个选项都是延迟加载,因此您一次加载的视图永远不会超过三个。

更新:OP 评论说他们已经有很多滚动视图委托的代码。假设他们无法替换该代码并使用UIPageViewController 之类的东西,这里的有效解决方案是在正在使用的现有滚动视图中重新创建UIPageViewController 的行为。警告:与使用专门用于这项工作的东西相比,我不推荐这种解决方案。

1) 实现scrollViewDidScroll(scrollView: UIScrollView),以便您知道用户何时滚动。

2) 使用let page = floor((scrollView.contentOffset.x - yourPageWidthHere / 2) / yourPageWidthHere) + 1; 之类的信息计算他们所在的“页面”(凭记忆编写;请检查!)

3) 预加载阵列中位于该页面 +/- 1 的所有页面。卸载所有其他页面,将它们替换为视图控制器阵列中的 NSNull,以便位置不会移动。

4) 更新滚动视图的contentSize 属性以允许用户继续滚动。如果您想将它们跳回到更早的点,您可以这样做,但我认为这不会对性能产生任何影响。

【讨论】:

  • 请查看此截屏视频link,我认为这不可能与UIPageViewController(顶部导航)有关
  • 我提供了一个基于UIScrollView的解决方案。这样做并不难,但确实需要相当多的代码。
  • 注意:如果您从未管理过视图控制器数组,Apple 的“PageControl”示例代码将帮助您入门。具体见this file where the exact approach is used
  • 对;上面的链接显示了如何使用NSNull 填充视图控制器数组并根据需要加载/卸载所需的视图控制器。
  • @JohnTravolta:我给你的 Apple 示例代码有一个完整的、有效的我的解决方案示例;如果您在将其移植到您的应用时出错,我们可能很难调试。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
相关资源
最近更新 更多