iOS H5退出全屏播放视频 导航栏上移

概述

iOS 项目中一个视图控制器里, 类似今日头条那种的分栏显示很多子控制器. 在第一个子控制器里内嵌了一个H5页面, 如下图所示:

层级关系.jpg

图里的 NBBaseWebVC 是最上层的一个自定义的 WebView 控制器, 这里放了一个测试的斗鱼直播页面。这个斗鱼直播页面的视频是支持全屏播放的,全屏播放状态下,默认 statusBar 是隐藏状态的。因此当退出全屏播放后,如果对状态栏不做任何处理,那么就会保持状态栏隐藏的状态,看起来是导航栏被上移了。

分析

合适的时机

导航栏上移了,咋办,有啥法子呢。如上段分析,之所以上移了,原因是因为状态栏被隐藏了,所以只能往状态上做文章了。我们需要在合适的时机告诉系统,嘿,哥们,我们已经不全屏播放了,回到垂直的状态了,麻烦你把状态栏给我搞回来吧。
这个合适的时候就是退出全屏播放的时候,那么我们怎么知道即将退出全屏播放呢。这个地方有个小技巧,当 H5 页面进行全屏播放的时候,是需要新建个 window 的,即将退出全屏播放的状态,就是这个窗口即将消失的状态。只要我们监听了 UIWindowdidBecomeHiddenNotification 通知,就能得到这个合适的时机,在这个通知的方法里面,告诉系统:来吧,让我们更新下状态栏的状态吧。这个告诉系统状态栏的方法就是 setNeedsStatusBarAppearanceUpdate,调用这个方法之后,系统就会重新读取控制器的 prefersStatusBarHidden 属性,我们要做的工作就是在当前控制器里重写这个属性,返回正确的值。如下:

    override var prefersStatusBarHidden: Bool {
        return UIApplication.shared.statusBarOrientation.isLandscape
    }

狡猾的 prefersStatusBarHidden

大多数情况下,如果只在当前控制器里重写 prefersStatusBarHidden ,会发现状态栏并没有达到我们想要的效果。奇怪啊,我已经告诉当前控制器,给我把状态栏给改了,怎么没有起到效果呢。别着急,来进行如下的检查游戏吧。

Info.plist 设置

View controller-based status bar appearanceinfo.plist 中必须设置为 YES。

控制器的层级

如果当前的 viewController 被一个自定义的导航控制器包裹,导航控制器又被 TabBarViewController 控制,结构如: UITabViewController(自定义)-> UINavigationController(自定义) -> UIViewController,那么就需要在上面的三个类中都重写
prefersStatusBarHidden来完成设置,我的实践代码如下:

UITabViewController(自定义)
    override open var prefersStatusBarHidden: Bool {
        return self.selectedViewController?.prefersStatusBarHidden ?? false
    }

selectedViewController 是当前的导航控制器

UINavigationController(自定义)
    override open var prefersStatusBarHidden: Bool {
        return self.topViewController?.prefersStatusBarHidden ?? false
    }

topViewController 是当前播放视频的控制器

UIViewController(当前控制器)
    override var prefersStatusBarHidden: Bool {
        return UIApplication.shared.statusBarOrientation.isLandscape
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中...
    浅滩zyb阅读 129评论 0 1
  • bettercap是一个强大的,模块化的,方便并且容易扩展的中间人攻击框架。 主要选项: -T:指定中间人目标(I...
    留白_bb77阅读 640评论 0 0
  • 1 字符串和二进制之间的相互转换 字符串转化为二进制:encode() 默认为utf8,若为gbk需要注明 ...
    嘻嘻吖_94e2阅读 214评论 0 0
  • Ajax与JSON学习 一、Ajax学习 1.什么是ajax? Ajax是使用客户端脚本与Web服务器交换数据的W...
    袁小胜阅读 242评论 0 0
  • 很多时候的竞争是你怎么有效利用你的时间,其它时候是读书带给你的观念更新; TODO2 a。所有获得cart的信息都...
    外腾湖南阅读 312评论 0 0