如何在启用分页的情况下实现 UIScrollView 平铺?

Posted

技术标签:

【中文标题】如何在启用分页的情况下实现 UIScrollView 平铺?【英文标题】:How do I implement UIScrollView tiling with paging enabled? 【发布时间】:2019-04-17 02:25:59 【问题描述】:

我正在尝试创建无限滚动分页UIScrollView 我一直在关注来自WWDC 2010 的Advanced UIScrollView Techniques 视频,但是我不确定如何为分页UIScrollView 创建平铺。我一直在使用本教程作为指导 Infinite Paging 和 this Stack Exchange answer。是否可以在分页UIScrollView 中创建这样的效果,或者平铺主要仅用于连续滚动环境。感谢您的帮助。

【问题讨论】:

通过平铺,如果你的意思是你有一个想要 360 度滚动的项目的水平列表,你可以附加两个额外的视图,最后一个,最后一个,并且可以检查偏移值,如果它是最后一个(第一个),您将偏移更改为第二个(真正的第一个),没有任何动画,最后一个类似,它看起来用户正在无限滚动。在集合视图中更容易实现。 【参考方案1】:

如果您需要无限滚动,您可以在滚动后更改元素位置。 非常简单的示例和肮脏的代码,但我回家我帮助了你:

import UIKit

class MainVC: UIViewController, UIScrollViewDelegate 

@IBOutlet var scrollView: UIScrollView!

var currentView: UIView?
var nextView: UIView?
var previousView: UIView?

override func viewDidLoad() 
    super.viewDidLoad()
    scrollView.isPagingEnabled = true
    scrollView.delegate = self
    generateViews()


func generateViews() 
    let screenSize = UIScreen.main.bounds
    currentView = UIView()
    nextView = UIView()
    previousView = UIView()

    addPosition(cView: currentView!, nView: nextView!, pView: previousView!)

    currentView?.backgroundColor = .red
    nextView?.backgroundColor = .green
    previousView?.backgroundColor = .blue

    scrollView.addSubview(currentView!)
    scrollView.addSubview(previousView!)
    scrollView.addSubview(nextView!)
    scrollView.contentSize = CGSize(width: screenSize.width * 3, height: screenSize.height)



func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) 
    if scrollView.contentOffset.x >= (UIScreen.main.bounds.width * 2) 
        addPosition(cView: nextView!, nView: previousView!, pView: currentView!)
     else if scrollView.contentOffset.x == 0 
        addPosition(cView: previousView!, nView: currentView!, pView: nextView!)
    
    scrollView.contentOffset = CGPoint(x: UIScreen.main.bounds.width, y: 0)


func addPosition(cView: UIView, nView: UIView, pView: UIView) 
    let screenSize = UIScreen.main.bounds
    cView.frame = CGRect(origin: CGPoint(x: screenSize.width, y: 0), size: screenSize.size)
    nView.frame = CGRect(origin: CGPoint(x: screenSize.width * 2, y: 0), size: screenSize.size)
    pView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: screenSize.size)

    currentView = cView
    nextView = nView
    previousView = pView



【讨论】:

感谢您花时间写出如此详细的答案。我想在每个视图上换入和换出多个视图控制器。您如何建议添加和删除视图控制器,以免它们同时启动。

以上是关于如何在启用分页的情况下实现 UIScrollView 平铺?的主要内容,如果未能解决你的问题,请参考以下文章

在启用本机分页的情况下查看 UICollectionView 中的上一个/下一个单元格?

尝试在启用分页的情况下访问 VESA LFB 时出现页面错误

在启用分页的情况下将表格视图添加到滚动视图。

UICollectionView 在启用分页的情况下不会滚动完整的 320 点

在启用分页的情况下使两个 UICollectionView 同步滚动

在启用分页的情况下检测滚动视图中的 y 偏移量何时发生变化