问题标签 [uicollectionviewcompositionallayout]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
938 浏览

swift - UICollectionViewCompositionalLayout 的粘性标题很生涩

我正在尝试使用最新的 UICollectionViewCompositionalLayout 来使用 UICollectionViewDiffableDataSource 显示分页数据。我想在该部分上方显示一个粘性标题,即使在从网络加载下一页数据时也始终保持在顶部。我注意到粘性标题没有按预期工作,而是在后台下载数据时感觉生涩并应用新快照。我能够使用 Apple在此处共享的示例应用程序重现此问题

这是重现该问题的代码:

上面的代码片段为 UICollectionViewCompositionalLayout 提供了部分标题,该部分标题固定到顶部的可见边界。

在上面的代码中,我将集合视图添加到视图控制器视图。

在上面的代码中,我创建了一个构建单元格和标题视图的 diffable 数据源。它还使用初始数据的快照初始化集合视图。快照始终应用在后台串行队列中。

当内容偏移接近尾声时,我将获取下一页数据并应用新快照,如您在此处看到的那样..

在此处输入图像描述

Pull To Refresh 操作也观察到类似的行为。

我注意到的另一件事是,当您立即添加数据并在线程之间切换时不会发生这种情况。

感谢任何帮助..

0 投票
1 回答
919 浏览

ios - 更改快照动画差异值时如何处理不一致的行为?

我将从解释事情如何工作开始:

我有具有组合布局和可区分数据源的集合视图。

单元格代表任务,用户可以单击并将其设置为今天已完成,单元格具有不同的外观,具体取决于其是否设置为已完成,并且单元格检查 CoreData 以了解它是否已完成。

现在我试图实现一个想法,即一天完成的任务进入视图的底部,因此顶部只有那些仍然必须完成的任务。为此,我为我的获取请求设置了排序描述符。

直到那一刻一切都按预期工作,但我想让这个单元格向下移动,所以我 dataSource.apply(snapshot, animatingDifferences: false)改为true

现在它的动画但单元格在设置为完成时不会改变外观。

这是我的 setupSnapshot 方法():

看看: animatingDifferences: false(left) and true(right)

动画差异:假 动画差异:真

总而言之,我的目标是:

1)动画单元格和2)设置为完成时更改外观。似乎 with animatingDifferences: falsei 只能有目标 2而 withanimatingDifferences: true只能有目标 1

我已经尝试研究过这个主题,并发现了两次应用快照的方法,一次用于部分,一次用于项目,但没有任何区别。

任何人都可以指出我在这里缺少什么?

0 投票
0 回答
124 浏览

swift - UICollectionViewCompositionalLayout 是否可以创建 PinterestLayout?

我可以UICollectionViewCompositionalLayout用来创建类似 Pinterest / Waterflow 的布局吗?

关闭是与

但我不知道如何删除每个项目下的空间在此处输入图像描述

0 投票
2 回答
2284 浏览

swift - 组合布局和损坏的自身大小的单元格

我使用的是相对简单的组合布局,它可以工作,但在某些情况下,我的 UICollectionView 中的最后一个或两个单元格似乎宽度损坏。

我的 collectionView 由具有动态宽度和静态高度的单元格组成。我可以预先计算高度,因为我的单元格基本上是 UILabel 加上背景 UIView 加上顶部/左侧/右侧/底部约束(每个都有 UIPriority(1000))。

等等。

我知道 UILabel 的字体,我知道所有约束的常量,所以很容易预测单元格的高度。

因此,我的布局如下所示:

问题是,它可以在 iPhone 11 上的模拟器中运行,但是当我试图在较小的屏幕上模拟它时,这个 collectionView 似乎被破坏了(在我的例子中,iPad Air 第 3 代与 iPhone 兼容)。

在这种情况下,最后一两个单元格的宽度已损坏,我不知道为什么:

坏的

应该如何: 好一个(像魅力一样工作)

这里发生了什么?

0 投票
0 回答
1570 浏览

ios - 使用 UICollectionViewCompositionalLayout 自行调整单元格大小

我有一个视图控制器,它显示一个带有自调整单元格的集合视图。集合视图有一个水平滚动的部分。它看起来像这样:

集合视图

问题

pageSheet在 iOS 13+ 上使用默认样式呈现视图控制器时,集合视图的行为异常。

  1. 在工作表上向上拉时,单元格可能会像下面标有“校正”的单元格一样调整大小:

错误 1

  1. 向上拉纸张时,内容可能会水平移动。有时,细胞也可能消失:

错误 2

问题

有没有办法在仍然使用UICollectionViewCompositionalLayoutpageSheet演示风格的同时解决这个问题?

代码摘要

代码非常简单。只有 3 个类,可以ViewController.swift使用 Xcode 中的 Single View App 项目模板将其拖放到文件中。

  1. 一个UICollectionViewCell名为Cell. 该单元格具有 aUILabel和 overrides sizeThatFits(_:)
  2. AUIViewController被称为ViewController仅用于呈现BugViewController
  3. BugViewController,它配置数据源并呈现集合视图。这就是问题发生的地方。

代码

笔记

  • 我的应用程序中的集合视图实际上有很多部分并垂直滚动。这就是为什么我orthogonalScrollingBehavior在示例代码中使用垂直滚动的集合视图和一个部分。

失败的尝试

  • 我尝试使用自动布局约束而不是sizeThatFits(_:).
  • 我试过不使用UICollectionViewDiffableDataSource.

解决方法

使用子滚动视图修改单元格并传入一个字符串数组(而不是一次一个)确实可以避免这个问题。但是,如果可能的话,我想避免这种肮脏的黑客行为。

0 投票
1 回答
2351 浏览

ios - 集合视图 Diffable 数据源单元格消失且未正确调整大小?

我的收藏视图有一个非常奇怪的问题。我正在使用适用于 iOS 13+ 的 Compositional Layout 和 Diffable Data Source API,但我遇到了一些非常奇怪的行为。如下面的视频所示,当我更新数据源时,添加到顶部的第一个单元格没有正确调整大小,然后当我添加第二个单元格时,两个单元格都消失了,然后当我添加第三个单元格时,都以适当的尺寸加载并出现。当我取消添加所有单元格并以类似的方式再次添加它们时,最初的问题不会再次发生。

错误视频

我尝试以某种方式使用以下解决方案:

我似乎无法弄清楚可能导致此问题的原因。也许可能是我在集合视图中注册了两个不同的单元格,并且不正确地将它们出列,或者我的数据类型不正确地符合可散列。我相信我已经解决了这两个问题,但我也会提供我的代码来提供帮助。此外,提到的数据控制器是一个简单的类,它存储了一组视图模型,供单元格用于配置(那里不应该有任何问题)。谢谢!

集合视图控制器

邀请单元格(第一个单元格类型)

受邀细胞(第二细胞类型)

Invites Cell View Model(细胞模型)

如果我需要提供其他任何东西来更好地帮助回答这个问题,请在评论中告诉我!

0 投票
1 回答
155 浏览

ios - UICollectionViewCompositionalLayout:右对齐部分内的单元格

我有这个布局,主图是一个UICollectionView,缩略图在自己的UICollectionView中。

**在此处输入图片描述**

设计要求缩略图右对齐,因此 UICollectionView 中的内容需要向右推送。我怎样才能做到这一点?我只需要支持 iOS 13 及更高版本,所以我使用UICollectionViewCompositionalLayout.

0 投票
0 回答
227 浏览

ios - UICollectionViewCompositionalLayout:以小数组宽度控制组中的项目数

使用UICollectionViewCompositionalLayout,我想在一个组中呈现特定数量的项目,在另一组中呈现特定数量的项目

这是我想出的布局的简化版本:

作为一个例子,我用

结果print(lineGroup.visualDescription())很有趣,说明了我的问题:

该 ascii 图形中的每个小块都是可以(并且正在)渲染项目的位置。

因此,鉴于要渲染的项目足够小,所有 5 个项目(2 个文本,3 个图像)都在左侧 textGroup 中渲染,即使该组仅包含 2 个NSCollectionLayoutItem.

我的实验表明,这种意外行为受.fractionalWidth(0.6)群体规模的控制。一旦我使用它,就会UICollectionViewCompositionalLayout忽略我在该组中指定的项目数。

UICollectionViewCompositionalLayout如果我将组宽度设置为.estimated(200). 但这弄乱了我的完整布局并使其无法使用。

如何控制组中的项目数具有由指定的组宽度.fractionalWidth(0.6)?我希望如果它们不适合排成一行,我会得到一个换行符,因为我给出了一个分数宽度和该组的估计高度。

0 投票
1 回答
629 浏览

ios - 如何使用 UICollectionViewCompositionalLayout 创建具有相等行高的网格布局

我已经成功地能够使用UICollectionViewCompositionalLayout. UICollectionViewCell但是,当它们的高度是动态的时,我无法找到一种聪明的方法来确保网格中每一行的高度相同。即我希望单元格拉伸以填充行中的可用空间高度。

所需布局:

  • 网格 (3 x N)
  • 可变高度单元
  • 每个单元格在给定行中具有相同的高度。(使用连续的最大单元格高度)
  • 每个单元格底部的小分隔线。

注意:行本身是正确的高度,但我希望单元格内容拉伸以填充可用空间,因为我需要在每个单元格的底部插入一个小的“行分隔符”。我考虑过为此使用补充视图,但它似乎有点混乱。

当前尝试:

结果:

示例代码:https ://github.com/johnliedtke/grid-layout

0 投票
0 回答
441 浏览

ios - UICollectionViewCompositionalLayout + UICollectionViewDiffableDataSource:有没有办法根据部分数据更改装饰视图?

我有一个UICollectionView使用UICollectionViewCompositionalLayout并且UICollectionViewDiffableDataSource工作正常。

单元由在数据源的初始化程序中定义的 cellProvider 提供。提供程序返回具有 indexPath 特定数据的单元格。

补充意见由var supplementaryViewProvider: UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType>.SupplementaryViewProvider

唯一的问题:我没有找到类似的东西DecorationViewProvider

按照 WWDC 2019 示例,我使用

为部分提供背景视图。

问题:由于我没有找到提供者,背景装饰视图会自动初始化,所以我没有找到根据部分数据更改它的方法。

例如,我想根据部分为背景装饰视图设置不同的颜色。

如何让背景装饰视图知道它属于哪个部分或如何根据部分设置属性?

(我想到的只有肮脏的技巧:我可以编写 20 个不同的类SectionBackgroundDecorationView1,每个类都SectionBackgroundDecorationView2使用不同forDecorationViewOfKind:的类,每个类都硬编码它属于第 0 节,第 1 节......必须有更好的解决方案)