Swift开发中指定视图内视频无法全屏播放的问题求助
适配修复方案
问题根因
- 你当前只在初始化AVPlayerLayer时设置了一次frame,而
viewDidLoad阶段AutoLayout还未完成最终布局,此时拿到的videoView.bounds不是不同设备适配后的最终正确尺寸,当后续videoView布局完成后,AVPlayerLayer作为CoreAnimation层不会自动跟随所属UIView的尺寸变化更新frame,就会出现尾部留白。 - 原代码存在笔误:
viewDidLoad中调用的videoView()和你实际定义的视频初始化方法videoViewForLogin()名称不一致,会导致视频初始化逻辑未执行。
修复步骤
- 将AVPlayerLayer声明为全局属性,方便布局更新时同步调整frame
- 重写
viewDidLayoutSubviews方法,每次视图布局更新时同步刷新playerLayer的frame为当前videoView的bounds - 修正方法调用的笔误,保证视频初始化逻辑正常触发
- 给videoView开启
clipsToBounds,避免视频超出视图范围溢出
修正后完整代码
import UIKit import AVFoundation class VideoViewController: UIViewController { @IBOutlet weak var videoView: UIView! // 把playerLayer声明为全局属性 var playerLayer: AVPlayerLayer! var player: AVQueuePlayer! var playerItem: AVPlayerItem! var playerLooper: AVPlayerLooper! override func viewDidLoad() { super.viewDidLoad() // 修正方法调用笔误 videoViewForLogin() // 开启裁剪,避免视频溢出 videoView.clipsToBounds = true } // 布局更新时同步调整playerLayer的frame override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() playerLayer.frame = videoView.bounds } func videoViewForLogin() { // 加载本地视频资源 guard let url = Bundle.main.url(forResource: "splashpanoslice", withExtension: "mp4") else { return } player = AVQueuePlayer() playerLayer = AVPlayerLayer(player: player) playerItem = AVPlayerItem(url: url) let asset = AVAsset(url: url) let duration = Int64( ( (Float64(CMTimeGetSeconds(asset.duration)) * 10.0) - 1) / 10.0 ) // 设置视频填充模式 playerLayer.videoGravity = .resizeAspectFill playerLooper = AVPlayerLooper( player: player, templateItem: playerItem, timeRange: CMTimeRange(start: CMTime.zero, end: CMTimeMake(value: duration, timescale: 1)) ) videoView.layer.insertSublayer(playerLayer, at: 0) player.play() } }
内容的提问来源于stack exchange,提问作者iosDevSan
相关产品推荐
相关产品推荐

