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

Swift开发中指定视图内视频无法全屏播放的问题求助

适配修复方案

问题根因

  1. 你当前只在初始化AVPlayerLayer时设置了一次frame,而viewDidLoad阶段AutoLayout还未完成最终布局,此时拿到的videoView.bounds不是不同设备适配后的最终正确尺寸,当后续videoView布局完成后,AVPlayerLayer作为CoreAnimation层不会自动跟随所属UIView的尺寸变化更新frame,就会出现尾部留白。
  2. 原代码存在笔误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:54:09