水平UIScrollView在swift中具有无限循环

时间:2015-12-15 10:48:53

标签: ios swift loops uiscrollview infinite

如何为水平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。

提前致谢。

Upadate:

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

1 个答案:

答案 0 :(得分: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属性以允许用户继续滚动。如果你想将它们跳回到你可以做到的早期点,但我不认为这会对性能产生任何影响。