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

如何实现退出全屏后UIWebView中YouTube视频继续播放?

解决iOS中YTPlayerView退出全屏后视频继续播放的问题

针对你遇到的iOS 11+下,使用YTPlayerView(基于UIWebView和iframe)播放YouTube视频,退出全屏时视频会被暂停的问题,我提供两个可行的解决方案:

方案一:利用YTPlayerView代理监听全屏状态,退出时恢复播放

这个方案通过官方的代理方法跟踪全屏状态变化,只有在视频原本处于播放状态时,退出全屏后才自动恢复播放,避免误触发。

  1. 首先让你的视图控制器遵循YTPlayerViewDelegate协议:
@interface YourViewController () <YTPlayerViewDelegate>
@property (nonatomic, assign) YTPlayerState lastPlaybackState;
@property (nonatomic, strong) YTPlayerView *playerView;
@end
  1. 在视图初始化时设置代理并加载视频:
- (void)viewDidLoad {
    [super viewDidLoad];
    // 初始化YTPlayerView并添加到视图
    self.playerView = [[YTPlayerView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 200)];
    self.playerView.delegate = self;
    [self.view addSubview:self.playerView];
    
    // 配置播放参数,开启内联播放和JS API支持
    NSDictionary *playerVars = @{
        @"playsinline": @1,
        @"enablejsapi": @1
    };
    [self.playerView loadWithVideoId:@"你的视频ID" playerVars:playerVars];
}
  1. 实现代理方法记录播放状态,并在退出全屏时恢复播放:
// 记录视频最新的播放状态
- (void)playerViewPlaybackStateDidChange:(YTPlayerView *)playerView state:(YTPlayerState)state {
    self.lastPlaybackState = state;
}

// 监听全屏状态切换事件
- (void)playerViewDidChangeToFullscreen:(YTPlayerView *)playerView isFullscreen:(BOOL)isFullscreen {
    // 退出全屏且之前视频处于播放状态时,调用playVideo恢复播放
    if (!isFullscreen && self.lastPlaybackState == kYTPlayerStatePlaying) {
        [playerView playVideo];
    }
}

方案二:注入自定义JS拦截全屏退出事件

因为YTPlayerView本质是UIWebView包裹YouTube的iframe播放器,我们可以通过注入JavaScript代码,直接修改播放器的全屏退出行为,让它退出时不暂停视频。

  1. 同样先确保加载视频时开启JS API支持:
NSDictionary *playerVars = @{
    @"enablejsapi": @1,
    @"playsinline": @1
};
[self.playerView loadWithVideoId:@"你的视频ID" playerVars:playerVars];
  1. 在视频加载完成后注入JS代码:
- (void)playerViewDidBecomeReady:(YTPlayerView *)playerView {
    // 兼容webkit系和标准全屏事件,退出全屏时自动调用播放
    NSString *jsCode = @"var player = document.getElementById('player'); "
                       "var fullscreenEvent = document.fullscreenchange ? 'fullscreenchange' : 'webkitfullscreenchange'; "
                       "player.addEventListener(fullscreenEvent, function(e) { "
                           "if (!document.fullscreenElement && !document.webkitFullscreenElement) { "
                               "player.playVideo(); "
                           "} "
                       "});";
    // 在UIWebView中执行自定义JS
    [playerView.webView stringByEvaluatingJavaScriptFromString:jsCode];
}

额外注意事项

  • 记得在Info.plist中设置UIViewControllerBasedStatusBarAppearance为YES,并确保视图控制器正确处理状态栏样式,避免全屏切换时的UI错乱。
  • iOS 11+下,需将UIWebView的allowsInlineMediaPlayback属性设为YES(也可在Info.plist中添加AllowsInlineMediaPlayback键值为YES),配合playsinline参数让视频支持内联播放。

这两个方案都能解决你遇到的问题:方案一更依赖YTPlayerView官方API,稳定性更好;方案二更直接,通过底层JS控制播放器行为,适合需要更自定义逻辑的场景。

内容的提问来源于stack exchange,提问作者Nicholas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:51