【问题标题】:Width and height of UICollectionViewCell 's subviews is zeroUICollectionViewCell 的子视图的宽度和高度为零
【发布时间】:2017-03-25 13:38:11
【问题描述】:
我一直被困在这个问题上,我想在自动布局完成后对 UICollectionViewCell 中的 CALayer 设置框架、角半径和其他操作。但令我惊讶的是,每次在单元格的子类中调用 layoutSubviews() 时,单元格的子视图及其 contentView 都会出现 (0.0, 0.0, 0.0, 0.0)。我终于找到了这个问题的解决方案并将其发布,以便如果您遇到类似问题,每个人都可以看看这个。
【问题讨论】:
标签:
ios
autolayout
uicollectionview
uicollectionviewcell
【解决方案1】:
我已经敲了一个多星期的头,但终于!这对我来说非常有效:
实现UICollectionViewDelegate的collectionView(_: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 中触发自动布局,而不仅仅是单元格本身。手动触发可能看起来很麻烦,但这是我得到的最好的。