为什么我的UICollectionView无法加载自定义视频播放单元格?
问题排查及解决方案
单元格布局坐标硬编码导致控件溢出屏幕
原因:
ClipsCollectionViewCell的layoutSubviews方法中,给用户名标签、功能按钮的y坐标用了880、850这类固定数值,当前主流iPhone屏幕高度普遍低于900pt,计算出的y值会为负数,所有控件都被渲染到屏幕可视区域外。
修复方案:不要用固定数值做偏移,改用相对于底部安全区的动态位置计算,比如所有控件的y值基于屏幕底部向上倒扣,参考写法:// 用户名标签放在底部安全区上方30pt位置 usernameLabel.frame = CGRect(x: (width-(size*3))/2, y: height - size - view.safeAreaInsets.bottom - 30, width: size*3, height: size)所有控件都按相对位置布局,不要写死固定偏移值。
异步逻辑中DispatchGroup匹配错误,列表无法刷新
原因:
createViewModel方法的guard判断中,如果头像URL获取失败或者视频URL无效,会直接return,不会调用completion闭包,导致之前调用的group.enter()没有对应的group.leave(),DispatchGroup永远不会触发notify回调,collectionView不会执行reloadData。
修复方案:给guard失败分支补充completion调用:guard let clipURL = URL(string: model.clipUrlString), let profilePhotoUrl = profilePictureURL else { completion(false) return }数据源为空无兜底测试逻辑
原因:你注释掉了本地模拟测试数据,实际运行时如果出现以下任意情况都会导致
viewModels为空:- UserDefaults中读取不到
username,fetchClips直接提前返回 - DatabaseManager拉取用户列表或者视频列表失败
- 账号下没有关联的视频数据
此时collectionView的数据源返回个数为0,自然没有任何单元格渲染。
修复方案:先放开本地模拟数据的注释,验证UI渲染逻辑正常后,再逐步排查网络请求、数据库读写的问题,也可以在viewModels为空时添加空白页提示。
- UserDefaults中读取不到
视频图层复用泄漏(非当前空白的直接原因,但属于严重bug)
原因:每次调用
configureVideo都会给videoContainer添加新的AVPlayerLayer,复用单元格时旧的图层没有被移除,会导致内存飙升、后续视频渲染异常。
修复方案:在prepareForReuse或者configureVideo执行前,先移除videoContainer.layer上的旧AVPlayerLayer。
内容的提问来源于stack exchange,提问作者Globe
相关产品推荐
相关产品推荐

