如何为水平UIScrollView
创建无限循环视图?
我们说我有一个集合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
}
}
答案 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
属性以允许用户继续滚动。如果你想将它们跳回到你可以做到的早期点,但我不认为这会对性能产生任何影响。