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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:15:00