AVPlayerViewController通过UIViewControllerRepresentable嵌入ZStack溢出如何解决
解决方法
你遇到的溢出问题由两个原因导致:一是AVPlayerViewController默认的视频填充模式会保留视频原始比例,很容易超出容器边界;二是封装的UIKit视图没有配置自动适配SwiftUI父视图尺寸的约束,按以下步骤修改即可:
1. 修改MyPlayerView封装逻辑,新增两个适配配置
struct MyPlayerView: UIViewControllerRepresentable { var url: URL func updateUIViewController(_ playerController: AVPlayerViewController, context: Context) { } func makeUIViewController(context: Context) -> AVPlayerViewController { let vc = AVPlayerViewController() // 配置视频填充模式:等比例缩放,完整展示在容器内,不会裁剪也不会溢出 vc.videoGravity = .resizeAspectFit // 配置UIKit视图自动跟随SwiftUI父容器尺寸调整大小 vc.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] let player = MyPlayer(url: url) vc.player = player vc.player?.play() return vc } }
2. 调整容器视图布局,增加适配和裁剪规则
var myContainer: some View { ZStack { MyPlayerView(url: vUrl) .scaledToFit() // 保证视图按比例适配ZStack的大小 } .clipped() // 强制裁剪所有超出ZStack边界的内容,彻底避免溢出 }
你原本外层设置的frame代码不需要修改,调整完上述两处即可让视频完整正常显示在ZStack内部。
内容的提问来源于stack exchange,提问作者zumzum
相关产品推荐
相关产品推荐

