You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的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为空:

    1. UserDefaults中读取不到username,fetchClips直接提前返回
    2. DatabaseManager拉取用户列表或者视频列表失败
    3. 账号下没有关联的视频数据
      此时collectionView的数据源返回个数为0,自然没有任何单元格渲染。
      修复方案:先放开本地模拟数据的注释,验证UI渲染逻辑正常后,再逐步排查网络请求、数据库读写的问题,也可以在viewModels为空时添加空白页提示。
  • 视频图层复用泄漏(非当前空白的直接原因,但属于严重bug)

    原因:每次调用configureVideo都会给videoContainer添加新的AVPlayerLayer,复用单元格时旧的图层没有被移除,会导致内存飙升、后续视频渲染异常。
    修复方案:在prepareForReuse或者configureVideo执行前,先移除videoContainer.layer上的旧AVPlayerLayer。

内容的提问来源于stack exchange,提问作者Globe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:03