停止单个 UICollectionView 单元格流向屏幕中心

2023-11-26

我试图理解为什么集合视图仅将集合中的最后一个单元格居中对齐。
我创建了一个简单的基于流布局的集合视图。我正在使用自动布局标志 - 我不确定是否会导致此问题。

每当我从“集合”视图中删除一个单元格时,前几个单元格似乎工作正常并滚动到左侧。然而,当我删除倒数第二个时,最后一个单元格突然从左对齐变为中心对齐。 有人有解释吗?看起来很奇怪。

我该如何做才能使所有单元格都向左滚动并保持向左对齐。

编辑:这是视图层次结构调试:https://i.stack.imgur.com/mCGzH.jpg

这是视图行为

Collectionview centring

我做了一个简单的github来演示它:https://github.com/grantkemp/CollectionViewIssue

这是代码:

        var dataforCV = ["short","longer phrase", "Super long Phrase"]

override func viewDidLoad() {
        super.viewDidLoad()
        demoCollectionView.reloadData()
    let layout = UICollectionViewFlowLayout()

    // Bug Description  - > UICollectionViewFlowLayoutAutomaticSize will center Align the layout if it has only a single cell - but it will left align the content if there is more than one cell.

    // I would expect this behaviour to be consistently left aligning the content.

    //How to repeat: If you comment out UICollection​View​Flow​Layout​Automatic​Size then the collection view will show 3 cells being left aligned and it will continue to left align all the content no matter how many cells you remove.

    // But: if you leave turn UICollection​View​Flow​Layout​Automatic​Size on - then it will intially show 3 cells being left aligned, and then as you click to remove each cell they will stay left aligned until the last single cell will suddenly center align in the collection view

    //  see here for the screen recording:https://i.stack.imgur.com/bledY.gif
    //  see here for the view hierachy debuggins screen: https://i.stack.imgur.com/mCGzH.jpg

    layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize


    // <-- End Bug Description
    demoCollectionView.collectionViewLayout = layout
}

    //MARk: CollectionView

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as? collectionCell
        cell?.text.text  = dataforCV[indexPath.row]

        return cell!

    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataforCV.count
    }
    //Remove the item from the array if selected
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        dataforCV.remove(at: indexPath.row)
        demoCollectionView.deleteItems(at: [indexPath])
    }

我设法使用以下两个步骤解决了这个问题:

  1. 向 Apple 记录了一个关于奇怪行为的错误,我注意到使用UICollectionViewFlowLayoutAutomaticSize
  2. 我通过创建一个修改后的解决方法CustomViewFlowLayout(找不到原始的 SO/github 问题,我在其中看到了这种方法的使用 - 如果我找到它,我会添加它)然后我添加了UICollectionViewFlowLayoutAutomaticSize设置 - 而且效果很好。

示例代码:

class MyLeftCustomFlowLayout:UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

        let attributes = super.layoutAttributesForElements(in: rect)

        var leftMargin = sectionInset.left
        var maxY: CGFloat = 2.0

        let horizontalSpacing:CGFloat = 5

        attributes?.forEach { layoutAttribute in
            if layoutAttribute.frame.origin.y >= maxY
                || layoutAttribute.frame.origin.x == sectionInset.left {
                leftMargin = sectionInset.left
            }

            if layoutAttribute.frame.origin.x == sectionInset.left {
                leftMargin = sectionInset.left
            }
            else {
                layoutAttribute.frame.origin.x = leftMargin
            }

            leftMargin += layoutAttribute.frame.width + horizontalSpacing
            maxY = max(layoutAttribute.frame.maxY, maxY)
        }

        return attributes
    }

在 ViewController 中 - 您必须将流布局添加到集合视图中才能使其工作:

let layout = MyLeftCustomFlowLayout() 
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
myCollectionViewReference.collectionViewLayout = layout

我认为 Collection View 的实现绝对可以简化,但我将进一步研究它,因为我可以看到它有多么强大。

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

停止单个 UICollectionView 单元格流向屏幕中心 的相关文章

随机推荐

  • 在 SWT-Widgets 上自动生成 ID

    有没有办法在 SWT Widgets 上自动生成 ID 以便 UI Tests 可以引用它们 我知道我可以使用 seData 手动设置 id 但我想以某种通用的方式为现有应用程序实现此功能 您可以使用以下命令为应用程序中的所有 shell
  • python 客户端服务器编程?

    这是 python 中的多线程服务器和客户端的源代码 在代码中 客户端和服务器在作业完成后关闭连接 我想保持连接处于活动状态并通过相同的连接发送更多数据避免每次关闭和打开套接字的开销 以下代码来自 http www devshed com
  • 为什么我的解决方案如此慢以及如何提高查询性能?

    目前我已经能够优化很多性能 但仍然有点慢 最新编辑 我当前的解决方案 最快的自动取款机 但仍然很慢 并保持秩序 server router post images function req res next var image bucket
  • 数组名是指针吗?

    C 中数组的名称是指针吗 如果不是 数组名称和指针变量有什么区别 数组是数组 指针是指针 但大多数情况下数组名称是转换的到指针 经常使用的一个术语是它们decay到指针 这是一个数组 int a 7 a包含七个整数的空间 您可以通过赋值将值
  • Pyspark 列转换:计算列中每个组的百分比变化

    我在本地计算机上使用 Pyspark 我有一个包含 450 万行和大约 30 000 种不同股票的 Spark 数据框 我需要计算每只股票随时间变化的百分比 我已经运行了 orderBy 以便将所有股票分组在一起 如下例所示 下面是一个简化
  • 在curl 7.33.0中使用--http2.0选项给出了不受支持的协议

    我使用的是centos 6 2 我需要在其中一个服务器请求中使用curl http2 0 但在查看之后我使用的是7 19 6http curl haxx se docs manpage html给我 http2 0 选项仅支持curl 7
  • Python:使用自动 Y 缩放绘制烛台

    我正在寻找一个Python绘图库 它允许我通过鼠标滚轮滚动 或类似 进行X缩放并在缩放时自动缩放Y轴来绘制烛台 最好是OHLC柱变体 作为我正在寻找的一个例子 tradingview com 完美地做到了这一点 看https uk trad
  • Spring Cloud:Feign 和 Http 连接池

    谁能告诉我 Spring Cloud Feign 客户端是否提供或支持 Http 连接池 如果是 如何配置池大小等设置 我在官方文档中似乎找不到这个 谢谢 通过调查 我将尝试回答我自己的问题 Spring Cloud Feign 使用 Ne
  • 为什么将闭包传递给接受函数指针的函数不起作用?

    In the 第二版Rust 编程语言 强调我的 函数指针实现了所有三个闭包特征 Fn FnMut and FnOnce 因此您始终可以将函数指针作为参数传递给需要闭包的函数 最好使用泛型类型和闭包特征之一来编写函数 以便您的函数可以接受函
  • 如何创建和使用ASP.NET vNext类库NuGet包?

    我想创建 ASP NET vNext 类库的 NuGet 包 我该怎么做 一步一步 我明白有kpm build 但我找不到关于在哪里下载 kpm 等的指南 另外 在获得它的 NuGet 包 或 DLL 后 如何将其从本地计算机添加到我的 v
  • 如何快速更新Google云存储上的静态站点?

    我有一个托管在谷歌云存储上的静态网站 我按照此处描述的相同方法进行设置 https cloud google com storage docs hosting static website 我已经购买了一个域名 目前网站运行顺利 我仍在更改
  • Asp.Net (MVC):哪个会话超时是什么?

    我制作了一个 Asp net MVC 网站 我对不同的超时设置感到非常困惑 有什么区别 web config 中的 SessionState 超时 应用程序池超时 Asp Net 会话超时属性 如果我想要 例如 6 小时的超时 我应该设置哪
  • PyQt4 - 从 QListWidget 中删除项目小部件

    我有一个 QListWidget 我需要删除一些项目 根据我的研究 这通常是一件令人不愉快的事情 我已经阅读了大量的解决方案 但没有一个适用于我的特定场景 目前 我只有实际的 Item Widgets 需要处理 不是它们的值或索引 这是因为
  • Visual Studio 忽略 #if DEBUG / RELEASE 范围内的代码,并且不检查错误或自动完成

    我一直在写一个 if DEBUG else endif代码片段 我注意到 Visual Studio 不允许我使用自动完成来完成部分键入的成员名称 并且它不会检查灰显的非活动代码是否有错误 我发现让它再次受到关注的唯一方法是将构建模式从 调
  • 在 LESS 中引用具有多层嵌套的父级

    我有以下较少 container column columns one width 40px 当我编译时 我的 CSS 得到以下内容 one container column one container columns width 40px
  • 在 Apache Spark Join 中包含空值

    我想在 Apache Spark 连接中包含空值 默认情况下 Spark 不包含带有 null 的行 这是默认的 Spark 行为 val numbersDf Seq 123 456 null toDF numbers val letter
  • ASP.net 中的 SendEmail 显示语法错误,命令无法识别。服务器响应是:Dovecot 就绪

    我想使用 ASP NET 发送邮件 代码如下 public void Semail string subject string messageBody string toAddress MailMessage mail new MailMe
  • 从 CGImageRef 创建的 UIImage 失败并显示 UIImagePNGRepresentation

    我使用以下代码从较大的 UIImage 中裁剪并创建一个新的 UIImage 我已将问题与函数 CGImageCreateWithImageInRect 隔离开来 该函数似乎没有按照我想要的方式设置某些 CGImage 属性 问题是调用函数
  • java - 通过引用传递双精度值

    如何在java中通过引用传递双精度值 example Double a 3 0 Double b a System out println a a b b a 5 0 System out println a a b b 此代码打印 a 3
  • 停止单个 UICollectionView 单元格流向屏幕中心

    我试图理解为什么集合视图仅将集合中的最后一个单元格居中对齐 我创建了一个简单的基于流布局的集合视图 我正在使用自动布局标志 我不确定是否会导致此问题 每当我从 集合 视图中删除一个单元格时 前几个单元格似乎工作正常并滚动到左侧 然而 当我删