- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望我的 UICollectionView
的最小项目大小为 150x150。我希望组合布局确定有多少 150x150 单元格可以安全地适应环境,然后在必要时从 150x150 扩大尺寸以填补空白,但保持使用 150x150 单元格尺寸计算的相同列数。
以下是我的尝试,它在纵向和横向上都没有保持最小单元格大小为 150x150。
let compositionalLayout = UICollectionViewCompositionalLayout(sectionProvider: { (sectionIndex, environment) -> NSCollectionLayoutSection? in
let fraction: CGFloat = 1 / (floor((environment.container.effectiveContentSize.width / 150)))
let inset: CGFloat = 10
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(fraction), heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
item.contentInsets = NSDirectionalEdgeInsets(top: inset, leading: inset, bottom: inset, trailing: inset)
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1), heightDimension: .fractionalWidth(fraction))
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = NSDirectionalEdgeInsets(top: inset, leading: inset, bottom: inset, trailing: inset)
return section
})
collectionView.collectionViewLayout = compositionalLayout
最佳答案
我认为解决这类问题的方法是首先解决你能想到的最退化、最简单的情况,然后添加任何需要的改进。
所以让我们忽略所有关于间距的东西并问问自己:我们如何制作一个简单的正方形单元网格,每边 150 或更多?这些单元格将触及 Collection View 的边,并在所有边上相互触及;在这种退化的情况下没有任何类型的间距。
这里有一个方法可以做到这一点。我们将使用部分提供程序函数,以便我们知道 Collection View 的大小:
let compositionalLayout = UICollectionViewCompositionalLayout(sectionProvider: {
(sectionIndex, environment) -> NSCollectionLayoutSection? in
Collection View 的宽度可以容纳多少个这些方 block ?这是一个简单的整数除法问题:
let w = environment.container.effectiveContentSize.width
let max = Int(w) / 150
现在,我们将每行的项目数指定为一个数字 (max
),因此项目宽度无关紧要;我们将使用虚拟值。项目高度将是组高度,当我们到达它时,我们将穿过那座桥:
let itemSize = NSCollectionLayoutSize(
widthDimension: .absolute(10), // this is a dummy value
heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
好吧,让我们过那座桥。组高度需要与项目宽度相同,以使单元格呈正方形。项目宽度将是 Collection View 宽度除以每组项目数;这是我们已经计算为 max
的数字:
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1),
heightDimension: .absolute(w/CGFloat(max))) // square
let group = NSCollectionLayoutGroup
.horizontal(layoutSize: groupSize, subitem: item, count: max)
我们完成了:
let section = NSCollectionLayoutSection(group: group)
return section
尝试一下。如果您的单元格有边框,这将有所帮助,这样您就可以看到单元格边缘的位置。您会看到我们现在有大于 150 的方形单元格,无论是纵向还是横向,当然纵向和横向的单元格尺寸不同。
好的,在解决了退化案例的问题之后,让我们考虑一个更复杂的案例。让我们在所有内容之间设置一个 10 磅的空间:外部 10 磅的边距,加上单元格之间垂直和水平的 10 磅。我们所要做的就是添加三行:
group.interItemSpacing = .fixed(10)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = 10
section.contentInsets = .init(top: 0, leading: 10, bottom: 0, trailing: 10)
这实际上看起来不错,但我们的数学运算不再正确。我们可以看到这一点,因为细胞不再是方形的。
因此,让我们将插图和间距插入到我们的数学中。我们的单元格区域的最大宽度现在是 160,而不是 150,因为单元格每边将被剥夺 5 个点。 collection view 的宽度必须减少 10 点,因为它会在一侧抢走 10 点,也就是 20,但是我们刚才的计算将其中的 10 点放回去。所以,到处进行,我们最终得到这个:
let compositionalLayout = UICollectionViewCompositionalLayout(sectionProvider: {
(sectionIndex, environment) -> NSCollectionLayoutSection? in
// how many 150-or-larger squares can fit in our width?
let w = environment.container.effectiveContentSize.width - 10
let max = Int(w) / (150 + 10)
let itemSize = NSCollectionLayoutSize(
widthDimension: .absolute(10), // this is a dummy value
heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1),
heightDimension: .absolute(w/CGFloat(max) - 10)) // square
let group = NSCollectionLayoutGroup
.horizontal(layoutSize: groupSize, subitem: item, count: max)
group.interItemSpacing = .fixed(10)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = 10
section.contentInsets = .init(top: 0, leading: 10, bottom: 0, trailing: 10)
return section
})
看起来不错!这是一个没有魔数(Magic Number)的更通用的版本。我们首先将所有魔数(Magic Number)提取为属性,另外我还通过更改一些数字(边距)进行了概括:
var square = 150
var padding : CGFloat = 10
var margin : CGFloat = 16
我们的布局现在看起来像这样:
let compositionalLayout = UICollectionViewCompositionalLayout(sectionProvider: {
[self] (sectionIndex, environment) -> NSCollectionLayoutSection? in
let w = environment.container.effectiveContentSize.width - CGFloat(margin)*2 + padding
let max = Int(w) / (square + Int(padding))
let itemSize = NSCollectionLayoutSize(
widthDimension: .absolute(10), // this is a dummy value
heightDimension: .fractionalHeight(1))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let groupSize = NSCollectionLayoutSize(
widthDimension: .fractionalWidth(1),
heightDimension: .absolute(w/CGFloat(max) - padding)) // square
let group = NSCollectionLayoutGroup
.horizontal(layoutSize: groupSize, subitem: item, count: max)
group.interItemSpacing = .fixed(padding)
let section = NSCollectionLayoutSection(group: group)
section.interGroupSpacing = padding
section.contentInsets = .init(top: 0, leading: margin, bottom: 0, trailing: margin)
return section
})
这似乎确实符合我们的要求!为了确保,我已经为它编写了一个测试用例:
let vc = ViewController(collectionViewLayout: UICollectionViewFlowLayout())
vc.loadViewIfNeeded()
vc.collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
for _ in 1..<3 {
vc.margin = CGFloat(Int.random(in:7..<20))
vc.padding = CGFloat(Int.random(in:7..<20))
vc.square = Int.random(in:140..<170)
var foundMin = false
for w : CGFloat in stride(from: 280, to: 500, by: 1) {
for h : CGFloat in stride(from: 280, to: 800, by: 10) {
vc.view.frame = CGRect(x: 0, y:0, width: w, height: h)
vc.view.layoutIfNeeded()
let cell = vc.collectionView.visibleCells.first!
let sz = cell.bounds.size
XCTAssertEqual(sz.width, sz.height, accuracy: 0.1)
XCTAssertGreaterThanOrEqual(sz.width, CGFloat(vc.square))
if sz.width == CGFloat(vc.square) { foundMin = true }
}
}
XCTAssertTrue(foundMin)
}
这里的想法是表明我们的单元格始终是方形的,并且它们有时是所需的最小值但绝不会小于 - 这正是您在问题中施加的条件。我们使用依赖注入(inject)来随机化初始条件。
关于ios - UICollectionViewCompositionalLayout 最小项目大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67145078/
这个问题在这里已经有了答案: C sizeof a passed array [duplicate] (7 个回答) 8年前关闭。 在一个函数中,我声明了一个数组: int char_count_ar
简而言之,文件系统如何与 block 设备通信? 最佳答案 我对 block 大小不太了解。我认为 ext4(Linux)的文件系统的 block 大小是 4KB,考虑到现代处理器的页面大小(4KB)
我知道 tinyint(1) 和 tinyint(2) 具有相同的存储空间范围。 唯一的区别是显示宽度不同。这是否意味着 tinyint(1) 将存储所有类型的整数但只正确显示 0 到 9 的范围?而
今晚我已经研究了以下代码几个小时,但我只是摸不着头脑。 当使用函数从标准输入填充数组时,我不断收到“大小 8 的无效写入”和“大小 8 的无效读取”。 如有任何帮助,我们将不胜感激...我知道 Sta
我有一个 valgrind 错误,我不知道如何摆脱它们: ==5685== Invalid read of size 8 ==5685== at 0x4008A1: main (in /home
我对 Hadoop 的概念有点困惑。 Hadoop block 大小、拆分大小和 block 大小 之间有什么区别? 提前致谢。 最佳答案 block 大小和 block 大小相同。 拆分大小 可能与
我想不出一个好的标题,所以希望可以。 我正在做的是创建一个离线 HTML5 webapp。 “出于某些原因”我不希望将某些文件放在缓存 list 中,而是希望将内容放在 localStorage 中。
无法将 xamarin apk 大小减少到 80 MB 以下,已执行以下操作: 启用混淆器 配置:发布 平台:事件(任何 CPU)。 启用 Multi-Dex:true 启用开发人员检测(调试和分析)
我正在开发一个程序,需要将大量 csv 文件(数千个)加载到数组中。 csv 文件的尺寸为 45x100,我想创建一个尺寸为 nx45x100 的 3-d 数组。目前,我使用 pd.read_csv(
Hello World 示例的 React Native APK 大小约为 20M (in recent versions),因为支持不同的硬件架构(ARMv7、ARMv8、X86 等),而同一应用程
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
如何设置 GtKTextView 的大小?我想我不能使用 gtk_widget_set_usize。 最佳答案 您不能直接控制小部件的大小,而是由其容器完成。您可以使用 gtk_widget_set_
这个问题在这里已经有了答案: c++ sizeof() of a class with functions (7 个答案) 关闭 5 年前。 结果是 12。 foobar 函数存储在内存中的什么位置
当我在 ffmpeg(或任何其他程序)中使用这样的命令时: ffmpeg -i input.mp4 image%d.jpg 所有图像的组合文件大小总是比视频本身大。我尝试减少每秒帧数、降低压缩设置、模
我是 clojurescript 的新手。 高级编译后出现“77 KB”的javascript文件是否正常? 我有一个 clojurescript 文件: 我正在使用 leinigen: lein c
我想要一个 QPixmap尺寸为 50 x 50。 我试过 : QPixmap watermark(QSize(50,50)); watermark.load(":/icoMenu/preparati
我正在尝试从一篇研究论文中重新创建一个 cnn,但我对深度学习还是个新手。 我得到了一个大小为 32x32x7 的 3d 补丁。我首先想执行一个大小为 3x3 的卷积,具有 32 个特征和步幅为 2。
我一直在尝试调整 View Controller 内的 View 大小,但到目前为止没有运气。基本上,我的 View 最底部有一个按钮,当方向从纵向更改为横向时,该按钮不再可见,因为它现在太靠下了。
如何使用此功能检查图像的尺寸?我只是想在上传之前检查一下... $("#LINK_UPLOAD_PHOTO").submit(function () { var form = $(this);
我用 C++ 完成了这个,因为你可以通过引用传递参数。我无法弄清楚如何在 JavaScript 中执行此操作。我的代码需要更改什么?我的输出是1 this.sizeOfBst = function()
我是一名优秀的程序员,十分优秀!