问题标签 [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.
swift - UICollectionViewCompositionalLayout 的粘性标题很生涩
我正在尝试使用最新的 UICollectionViewCompositionalLayout 来使用 UICollectionViewDiffableDataSource 显示分页数据。我想在该部分上方显示一个粘性标题,即使在从网络加载下一页数据时也始终保持在顶部。我注意到粘性标题没有按预期工作,而是在后台下载数据时感觉生涩并应用新快照。我能够使用 Apple在此处共享的示例应用程序重现此问题
这是重现该问题的代码:
上面的代码片段为 UICollectionViewCompositionalLayout 提供了部分标题,该部分标题固定到顶部的可见边界。
在上面的代码中,我将集合视图添加到视图控制器视图。
在上面的代码中,我创建了一个构建单元格和标题视图的 diffable 数据源。它还使用初始数据的快照初始化集合视图。快照始终应用在后台串行队列中。
当内容偏移接近尾声时,我将获取下一页数据并应用新快照,如您在此处看到的那样..
Pull To Refresh 操作也观察到类似的行为。
我注意到的另一件事是,当您立即添加数据并在线程之间切换时不会发生这种情况。
感谢任何帮助..
ios - 更改快照动画差异值时如何处理不一致的行为?
我将从解释事情如何工作开始:
我有具有组合布局和可区分数据源的集合视图。
单元格代表任务,用户可以单击并将其设置为今天已完成,单元格具有不同的外观,具体取决于其是否设置为已完成,并且单元格检查 CoreData 以了解它是否已完成。
现在我试图实现一个想法,即一天完成的任务进入视图的底部,因此顶部只有那些仍然必须完成的任务。为此,我为我的获取请求设置了排序描述符。
直到那一刻一切都按预期工作,但我想让这个单元格向下移动,所以我
dataSource.apply(snapshot, animatingDifferences: false)
改为true
现在它的动画但单元格在设置为完成时不会改变外观。
这是我的 setupSnapshot 方法():
看看: animatingDifferences: false(left) and true(right)
总而言之,我的目标是:
1)动画单元格和2)设置为完成时更改外观。似乎 with animatingDifferences: false
i 只能有目标 2而 withanimatingDifferences: true
只能有目标 1
我已经尝试研究过这个主题,并发现了两次应用快照的方法,一次用于部分,一次用于项目,但没有任何区别。
任何人都可以指出我在这里缺少什么?
swift - 组合布局和损坏的自身大小的单元格
我使用的是相对简单的组合布局,它可以工作,但在某些情况下,我的 UICollectionView 中的最后一个或两个单元格似乎宽度损坏。
我的 collectionView 由具有动态宽度和静态高度的单元格组成。我可以预先计算高度,因为我的单元格基本上是 UILabel 加上背景 UIView 加上顶部/左侧/右侧/底部约束(每个都有 UIPriority(1000))。
等等。
我知道 UILabel 的字体,我知道所有约束的常量,所以很容易预测单元格的高度。
因此,我的布局如下所示:
问题是,它可以在 iPhone 11 上的模拟器中运行,但是当我试图在较小的屏幕上模拟它时,这个 collectionView 似乎被破坏了(在我的例子中,iPad Air 第 3 代与 iPhone 兼容)。
在这种情况下,最后一两个单元格的宽度已损坏,我不知道为什么:
这里发生了什么?
ios - 使用 UICollectionViewCompositionalLayout 自行调整单元格大小
我有一个视图控制器,它显示一个带有自调整单元格的集合视图。集合视图有一个水平滚动的部分。它看起来像这样:
问题
pageSheet
在 iOS 13+ 上使用默认样式呈现视图控制器时,集合视图的行为异常。
- 在工作表上向上拉时,单元格可能会像下面标有“校正”的单元格一样调整大小:
- 向上拉纸张时,内容可能会水平移动。有时,细胞也可能消失:
问题
有没有办法在仍然使用UICollectionViewCompositionalLayout
和pageSheet
演示风格的同时解决这个问题?
代码摘要
代码非常简单。只有 3 个类,可以ViewController.swift
使用 Xcode 中的 Single View App 项目模板将其拖放到文件中。
- 一个
UICollectionViewCell
名为Cell
. 该单元格具有 aUILabel
和 overridessizeThatFits(_:)
。 - A
UIViewController
被称为ViewController
仅用于呈现BugViewController
。 BugViewController
,它配置数据源并呈现集合视图。这就是问题发生的地方。
代码
笔记
- 我的应用程序中的集合视图实际上有很多部分并垂直滚动。这就是为什么我
orthogonalScrollingBehavior
在示例代码中使用垂直滚动的集合视图和一个部分。
失败的尝试
- 我尝试使用自动布局约束而不是
sizeThatFits(_:)
. - 我试过不使用
UICollectionViewDiffableDataSource
.
解决方法
使用子滚动视图修改单元格并传入一个字符串数组(而不是一次一个)确实可以避免这个问题。但是,如果可能的话,我想避免这种肮脏的黑客行为。
ios - 集合视图 Diffable 数据源单元格消失且未正确调整大小?
我的收藏视图有一个非常奇怪的问题。我正在使用适用于 iOS 13+ 的 Compositional Layout 和 Diffable Data Source API,但我遇到了一些非常奇怪的行为。如下面的视频所示,当我更新数据源时,添加到顶部的第一个单元格没有正确调整大小,然后当我添加第二个单元格时,两个单元格都消失了,然后当我添加第三个单元格时,都以适当的尺寸加载并出现。当我取消添加所有单元格并以类似的方式再次添加它们时,最初的问题不会再次发生。
我尝试以某种方式使用以下解决方案:
我似乎无法弄清楚可能导致此问题的原因。也许可能是我在集合视图中注册了两个不同的单元格,并且不正确地将它们出列,或者我的数据类型不正确地符合可散列。我相信我已经解决了这两个问题,但我也会提供我的代码来提供帮助。此外,提到的数据控制器是一个简单的类,它存储了一组视图模型,供单元格用于配置(那里不应该有任何问题)。谢谢!
集合视图控制器
邀请单元格(第一个单元格类型)
受邀细胞(第二细胞类型)
Invites Cell View Model(细胞模型)
如果我需要提供其他任何东西来更好地帮助回答这个问题,请在评论中告诉我!
ios - UICollectionViewCompositionalLayout:以小数组宽度控制组中的项目数
使用UICollectionViewCompositionalLayout
,我想在一个组中呈现特定数量的项目,在另一组中呈现特定数量的项目
这是我想出的布局的简化版本:
作为一个例子,我用
结果print(lineGroup.visualDescription())
很有趣,说明了我的问题:
该 ascii 图形中的每个小块都是可以(并且正在)渲染项目的位置。
因此,鉴于要渲染的项目足够小,所有 5 个项目(2 个文本,3 个图像)都在左侧 textGroup 中渲染,即使该组仅包含 2 个NSCollectionLayoutItem
.
我的实验表明,这种意外行为受.fractionalWidth(0.6)
群体规模的控制。一旦我使用它,就会UICollectionViewCompositionalLayout
忽略我在该组中指定的项目数。
UICollectionViewCompositionalLayout
如果我将组宽度设置为.estimated(200)
. 但这弄乱了我的完整布局并使其无法使用。
如何控制组中的项目数并具有由指定的组宽度.fractionalWidth(0.6)
?我希望如果它们不适合排成一行,我会得到一个换行符,因为我给出了一个分数宽度和该组的估计高度。
ios - 如何使用 UICollectionViewCompositionalLayout 创建具有相等行高的网格布局
我已经成功地能够使用UICollectionViewCompositionalLayout
. UICollectionViewCell
但是,当它们的高度是动态的时,我无法找到一种聪明的方法来确保网格中每一行的高度相同。即我希望单元格拉伸以填充行中的可用空间高度。
所需布局:
- 网格 (3 x N)
- 可变高度单元
- 每个单元格在给定行中具有相同的高度。(使用连续的最大单元格高度)
- 每个单元格底部的小分隔线。
注意:行本身是正确的高度,但我希望单元格内容拉伸以填充可用空间,因为我需要在每个单元格的底部插入一个小的“行分隔符”。我考虑过为此使用补充视图,但它似乎有点混乱。
当前尝试:
结果:
ios - UICollectionViewCompositionalLayout + UICollectionViewDiffableDataSource:有没有办法根据部分数据更改装饰视图?
我有一个UICollectionView
使用UICollectionViewCompositionalLayout
并且UICollectionViewDiffableDataSource
工作正常。
单元由在数据源的初始化程序中定义的 cellProvider 提供。提供程序返回具有 indexPath 特定数据的单元格。
补充意见由var supplementaryViewProvider: UICollectionViewDiffableDataSource<SectionIdentifierType, ItemIdentifierType>.SupplementaryViewProvider
唯一的问题:我没有找到类似的东西DecorationViewProvider
:
按照 WWDC 2019 示例,我使用
和
为部分提供背景视图。
问题:由于我没有找到提供者,背景装饰视图会自动初始化,所以我没有找到根据部分数据更改它的方法。
例如,我想根据部分为背景装饰视图设置不同的颜色。
如何让背景装饰视图知道它属于哪个部分或如何根据部分设置属性?
(我想到的只有肮脏的技巧:我可以编写 20 个不同的类SectionBackgroundDecorationView1
,每个类都SectionBackgroundDecorationView2
使用不同forDecorationViewOfKind:
的类,每个类都硬编码它属于第 0 节,第 1 节......必须有更好的解决方案)