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】:我已经敲了一个多星期的头,但终于!这对我来说非常有效:
实现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];
这可能看起来是一个非常繁琐的操作,但是每次集合视图插入一个新单元格并强制执行自动布局时,单元格的frame
s 通常在初始布局周期之后是(0.0, 0.0, 0.0, 0.0)
(如layoutSubviews()
中所观察到的) ) 但如果在单元格即将出现在屏幕上之前手动触发布局,则在自动布局周期完成后,您希望在 layoutSubviews()
中观察到的子视图的 frame
s 是您希望的。
确保在contentView
中触发自动布局,而不仅仅是单元格本身。手动触发可能看起来很麻烦,但这是我得到的最好的。
【讨论】:
以上是关于UICollectionViewCell 的子视图的宽度和高度为零的主要内容,如果未能解决你的问题,请参考以下文章
将视图控制器添加到 UICollectionViewCell
使用 xib 将手势添加到 UICollectionViewCell 子视图
从 UICollectionViewCell 到 ViewController 的自动布局约束
UICollectionViewCell与UIScrollView取消didSelectItemAtIndexPath