【发布时间】:2017-12-11 17:38:51
【问题描述】:
我正在为我的应用程序创建一个日历,其中每个月都有一个 UICollectionView 嵌入在 UITableView 的单元格中。 TableView 被固定到屏幕的安全区域,因此它的前后约束从屏幕的左右边缘等于 16。 UICollectionView 固定在表格单元格的 ContentView 上。
CollectionView 中的项目和项目行之间的间距以及部分插入都设置为 0。所以要连续 7 天,我使用itemWidth = tableView.frame.width / 7。然后我在DelegateFlowLayout协议的sizeForItem()方法中将此值设置为宽度和高度。
在运行时,所有值都被正确计算:例如,在 iPhone 8 屏幕上,tableView 宽度为 343,itemWidth 为 49,itemSize 为 (49, 49)。但在屏幕上看起来是这样的:
这是 iPhone SE 的结果:
我尝试以编程方式设置布局间距,但没有帮助。谁能解释我在哪里愚蠢以及屏幕上的 7 个相等的部分如何变成 8 个或 6 个?
更新。我试图从 ViewController 的主视图中计算宽度:itemWidth = (view.frame.width-32) / 7(其中 32 是安全区域插入的总和 - 2*16)。仍然使用零间距,这解决了 8 或 8plus 等较大屏幕的问题,但 SE 仍显示每周 6 天并强制项目之间的间距。至此,我对布局逻辑一无所知!
【问题讨论】:
-
尝试使用
collectionView.frame.width而不是tableView.frame.width。另外,当您说项目和行之间的间距为 0 时,您是否在minimumLineSpacingForSectionAt和minimumInteritemSpacingForSectionAt方法中返回 0? -
是的,在 IB 和使用这些方法的代码中都设置了 0 间距。我尝试使用 collectionView 宽度 - 结果相同。
-
在获取集合视图的项目大小后,看起来表格视图/集合视图宽度发生了变化?你能检查一下吗!否则代码应该可以工作。
-
大小在所有委托方法中都是一致的:
sizeForItem(), cellForItemAt(), willDisplayCell()。我还能在哪里检测宽度变化? -
分享你的代码。
标签: ios uicollectionview uicollectionviewlayout