CollectionView Cell 在水平滚动后向右移动

2023-12-20

我有一个与 CollectionView 大小相同的 collectionView Cell,即一次在屏幕上显示一个 Cell,并且我希望单元格之间的最小间距为 10,问题是当我滚动单元格时,单元格无法正确贴合整个屏幕,并且每次滚动后单元格的移动都会增加。 (查看屏幕截图以便更好地理解)


我假设你已经设置了pagingEnabled对于集合视图。它继承了这个属性UIScrollView(因为UICollectionView是一个子类UIScrollView).

问题在于集合视图使用自己的宽度(帖子中的 320 点)作为页面的宽度。每个单元格的宽度与集合视图相同,但单元格之间有一个 10 磅的“装订线”。这意味着从单元格 0 的左边缘到单元格 1 的左边缘的距离为 320 + 10 = 330 点。因此,当您滚动显示单元格 1 时,集合视图在偏移量 320(其自身宽度)处停止滚动,但单元格 1 实际上从偏移量 330 处开始。

最简单的解决办法可能是关闭pagingEnabled并通过覆盖自己实现分页scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)在你的集合视图委托中,如下所示:

override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return }

    let pageWidth = scrollView.bounds.size.width + flowLayout.minimumInteritemSpacing

    let currentPageNumber = round(scrollView.contentOffset.x / pageWidth)
    let maxPageNumber = CGFloat(collectionView?.numberOfItems(inSection: 0) ?? 0)

    // Don't turn more than one more page when decelerating, and don't go beyond the first or last page.
    var pageNumber = round(targetContentOffset.pointee.x / pageWidth)
    pageNumber = max(0, currentPageNumber - 1, pageNumber)
    pageNumber = min(maxPageNumber, currentPageNumber + 1, pageNumber)
    targetContentOffset.pointee.x = pageNumber * pageWidth
}

您还需要设置项目尺寸以匹配设备屏幕尺寸,并将减速率设置为快速:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout, let collectionView = collectionView else { return }
    flowLayout.itemSize = collectionView.bounds.size

    collectionView.decelerationRate = UIScrollViewDecelerationRateFast
}

Result:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CollectionView Cell 在水平滚动后向右移动 的相关文章

随机推荐

  • 如何获取配置标志的值?

    有没有办法获得a的值配置标志 https doc rust lang org reference html conditional compilation 例如 我想获取以下值target os as str String 不诉诸以下方法i
  • MySQL:写入从节点

    假设我有一个汽车数据库 我有品牌和型号 FK 到品牌 我计划让用户跟踪他们的汽车 每辆车都有一个 FK 型号 现在 我有很多用户 我想拆分数据库来分配负载 品牌和型号表变化不大 但它们需要跨分片共享 我的想法是使用 MySQL 从品牌和型号
  • 如果我没有关闭 PHP 标签,Notepad++ 函数列表 PHP 将无法工作

    我想在我的 PHP 代码中使用 notepad 的函数列表功能 实际上 如果我编写关闭 PHP 标签 gt 则函数列表可以正常工作 但是如果我没有关闭 PHP 标签 则函数列表将无法工作 我只是想 即使我没有关闭 PHP 标签 函数列表仍然
  • Ajax表单提交,文件未提交

    我正在尝试为我的 Django 表单实现 AJAX 表单提交 这些文件是在没有 AJAX 的情况下提交的 因此服务器端的逻辑似乎可以正常工作 使用ajax 除了文件之外的其余值都会被提交 这是我正在实现的代码 AJAX表单提交 functi
  • XPS 文件的结构是什么

    我认为 XPS 文件就像 PDF 文件 但是 XPS 文件的结构是什么 类似于 PDF 文件吗 CNET 上的 XPS 与 PDF http reviews cnet com 4520 3672 7 6673717 2 html Excer
  • 自定义键盘出现约 5 秒延迟

    我正在使用 objc Xcode 7 制作自定义键盘 尝试了 6 次 问题是键盘加载速度太慢 我尝试加载完全空的UIInputViewController的观点 没有变化 我没有xib 没有大量资源 如果有人知道这个问题的任何解决方案 请写
  • 更新 Javascript 2D 数组中的元素会更新整个列[重复]

    这个问题在这里已经有答案了 我在 Javascript 中创建了一个 2D 数组 4x4 如下所示 let visited new Array 4 fill new Array 4 fill false console log visite
  • Xcode 中的垂直突出显示(列选择)

    如何在 Xcode 中突出显示矩形选区 按住 Option 键的同时单击并拖动 进行垂直突出显示 块选择时 应用正常的复制和粘贴规则 command c 和 command v
  • 如何禁用 Dexguard?

    我浏览了文档 寻找如何在运行 gradle 时禁用 dexguard 但保留插件 dexguard 我尝试修改 proguardFilegetDefaultDexGuardFile dexguard debug pro 什么也不做 但不幸的
  • 键盘关闭时的背景故障

    我面临着我的片段布局 xml 有点复杂的情况 所以层次结构如下 相对布局 无背景 ScrollView fillViewPort true 滚动条 none FrameLayout 无背景 LinearLayout 无背景 Relative
  • 如何在flutter中从ModalBottomSheet刷新ParentStatefulWidget的状态

    我是颤振新手 我对小部件的状态没有正确的了解 我正在创建一个应用程序 在其中从主屏幕向购物车添加一些商品 然后单击 Cartbutton 我打开 ModalBottomSheet 用户还可以在其中修改其购物车商品 以及当用户关闭 Modal
  • 在 jekyll 中生成针对 github 页面的类别页面

    我正在尝试使用 jekyll 为我的 github 页面博客生成类别页面 当我在本地运行时使用jekyll serve这有效 因为它可以使用我的插件 使用这个例子从文档 https jekyllrb com docs plugins gen
  • IIS6 - 为什么我的自定义错误页面不显示?

    我有一个应该显示 HTTP 404 错误的自定义错误页面 事实并非如此 我很难弄清楚为什么 我的 web config 已设置
  • imap:从 C++ 程序发送电子邮件时“无法创建可选择的 TCP 套接字”

    我正在尝试使用 imap 库从 C 程序发送电子邮件 我有一个 Google Apps 和一个要向其发送电子邮件的 Gmail 帐户 每当程序无法发送电子邮件时 我都会将错误记录到文件中 我将程序设置为循环运行以发送电子邮件 有时 我收不到
  • Jsoup POST:定义返回 HTML 的选定选项?

    我正在尝试生成一个 HTML 帖子到一个包含选项列表的页面 有一个下拉列表 用户可以在其中选择一个项目 然后单击生成按钮 根据所选的选项 它会返回不同的结果 我对前后的 HTML 进行了比较 可以看到差异如下 Before
  • 对齐表标题中的文本

    它似乎align不适合th元素 这是我的 HTML div style width 100 height 175px table class grid thead tr th class not mapped style style dis
  • 合并bean定义的后处理失败;嵌套异常是 java.lang.IllegalStateException

    这是我的 OffersDao 课程 package com spring dao import java sql import javax sql DataSource import org springframework beans fa
  • 在我的网站上添加最新推文作为纯文本?

    我有一个 HTML CSS 网站 想要在页脚部分添加我最新的推文 请注意以下几点 我不喜欢他们网站上可用的 Twitter 小部件的外观 我只想将我最新的推文显示为文本 只是最后一条 而不是几条 然后我将添加背景并通过 CSS 自定义字体
  • 如何使用 jasmine 测试带有 DOM 元素的 JavaScript?

    我正在尝试在 jasmine 中为包含 DOM 元素的 JavaScript 代码编写一个测试 但该测试不起作用 当我仅测试 JavaScript 代码 只是简单的函数 但不适用于 DOM 元素 时 它可以工作 我研究了这么久 确实找不到答
  • CollectionView Cell 在水平滚动后向右移动

    我有一个与 CollectionView 大小相同的 collectionView Cell 即一次在屏幕上显示一个 Cell 并且我希望单元格之间的最小间距为 10 问题是当我滚动单元格时 单元格无法正确贴合整个屏幕 并且每次滚动后单元格