Swift给视频添加图片贴纸时CALayer设置(0,0)显示在左下角问题
问题原因
AVFoundation 导出视频时调用 CoreAnimation 做后处理的默认坐标系以左下角为原点,和 UIKit 常用的左上角原点坐标系Y轴方向完全相反,所以你设置 y: 0 时贴纸会固定在视频底部边缘,而不是你预期的顶部。
解决方法
有两种可行方案,更推荐第二种,后续布局多贴纸时更方便:
方案1:单独计算贴纸Y轴坐标
直接通过视频高度减去贴纸高度得到符合你预期的顶部Y值,修改你的imageLayer赋值代码即可:
// 原来的代码 // imageLayer.frame = CGRect(x: 0.0, y: 0.0, width:350, height:350) // 替换为下面的代码 imageLayer.frame = CGRect(x: 0.0, y: videoSize.height - 350, width:350, height:350)
方案2:翻转整个动画层坐标系
直接把动画层的坐标系翻转为和UIKit一致的左上角原点,后续所有子层布局都不需要再单独计算Y值:
let animationLayer = CALayer() animationLayer.frame = frame // 新增这一行代码即可 animationLayer.geometryFlipped = true animationLayer.addSublayer(videoLayer) animationLayer.addSublayer(imageLayer)
这个方案修改成本最低,也更符合常规UI布局的直觉,后续要加多个贴纸时直接按UIKit的坐标逻辑赋值即可,不需要每个都做Y轴换算。
额外注意事项
如果你的输入是竖屏拍摄的视频,有可能出现naturalSize和实际渲染尺寸不符的问题,建议你在取videoSize的时候优先通过视频的preferredTransform计算实际渲染尺寸,避免贴纸出现位置偏移。
内容的提问来源于stack exchange,提问作者KAPIL SONI
相关产品推荐
相关产品推荐

