关于AVPlayer的resizeAspect仅在iPhone X上正常工作的技术问询
解决视频重力
resizeAspect在非iPhone X机型上黑边不均的问题 我之前做视频播放适配时也碰到过几乎一模一样的问题,分享几个我亲测有效的排查和解决方向:
1. 先检查容器视图的背景色
很多时候底部的「白色背景」其实不是视频的问题,是视频容器视图的背景色没设为黑色!当视频用resizeAspect居中显示时,未被视频覆盖的区域会显示容器的背景色,你只需要把容器视图的backgroundColor设为.black,就能让上下黑边保持一致的深色效果了。
2. 确认容器视图的约束与布局
非iPhone X机型出现黑边只在顶部,大概率是容器视图的布局有问题:
- 确保容器视图的约束是和父视图的四边完全对齐,而不是只绑定顶部、左右,底部留空或者绑定到了错误的参考线;
- 如果用了Auto Layout,检查是否误将底部约束绑定到了安全区域底部(非iPhone X机型没有安全区域,会导致容器底部被拉高,视频只能在上方居中,底部露出父视图的白色),可以改成绑定到父视图的底部边缘。
3. 保证AVPlayerLayer的Frame实时更新
AVPlayerLayer不会自动跟随容器视图的尺寸变化,所以一定要在容器视图的layoutSubviews方法里同步更新layer的frame:
override func layoutSubviews() { super.layoutSubviews() playerLayer?.frame = self.bounds }
这样无论容器视图怎么变化,视频层都能填满容器,resizeAspect的居中黑边才会均匀显示。
4. 测试排除视频源本身的问题
可以临时把videoGravity改成resizeAspectFill,看看视频是否能铺满整个容器。如果铺满后没有白色区域,说明视频源的尺寸是正常的,问题还是出在布局或背景色上;如果还是有异常,再考虑检查视频的编码比例是否有问题。
内容的提问来源于stack exchange,提问作者thelearner
相关产品推荐
相关产品推荐

