UICollectionViewCell 的子视图的宽度和高度为零

Posted

技术标签:

【中文标题】UICollectionViewCell 的子视图的宽度和高度为零【英文标题】:Width and height of UICollectionViewCell 's subviews is zero 【发布时间】:2017-03-25 13:38:11 【问题描述】:

我一直被困在这个问题上,我想在自动布局完成后对 UICollectionViewCell 中的 CALayer 设置框架、角半径和其他操作。但令我惊讶的是,每次在单元格的子类中调用 layoutSubviews() 时,单元格的子视图及其 contentView 都会出现 (0.0, 0.0, 0.0, 0.0)。我终于找到了这个问题的解决方案并将其发布,以便如果您遇到类似问题,每个人都可以看看这个。

【问题讨论】:

【参考方案1】:

我已经敲了一个多星期的头,但终于!这对我来说非常有效:

实现UICollectionViewDelegatecollectionView(_:willDisplay:forItemAt:)函数并为collectionView即将显示的单元格的contentView触发一个新的布局循环。

斯威夫特:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 
     cell.contentView.setNeedsLayout()
     cell.contentView.layoutIfNeeded()

目标-C:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
     [cell.contentView setNeedsLayout];
     [cell.contentView layoutIfNeeded];

这可能看起来是一个非常繁琐的操作,但是每次集合视图插入一个新单元格并强制执行自动布局时,单元格的frames 通常在初始布局周期之后是(0.0, 0.0, 0.0, 0.0)(如layoutSubviews() 中所观察到的) ) 但如果在单元格即将出现在屏幕上之前手动触发布局,则在自动布局周期完成后,您希望在 layoutSubviews() 中观察到的子视图的 frames 是您希望的。

确保在contentView 中触发自动布局,而不仅仅是单元格本身。手动触发可能看起来很麻烦,但这是我得到的最好的。

【讨论】:

以上是关于UICollectionViewCell 的子视图的宽度和高度为零的主要内容,如果未能解决你的问题,请参考以下文章

将视图控制器添加到 UICollectionViewCell

使用 xib 将手势添加到 UICollectionViewCell 子视图

从 UICollectionViewCell 到 ViewController 的自动布局约束

UICollectionViewCell与UIScrollView取消didSelectItemAtIndexPath

如何在 UICollectionViewCell 上设置 UILabel?

iOS swift UICollectionviewcell 快照错误