ios 几十行代码完成原生播放器UIView嵌入WKWebView层级

混合开发已经非常流行了。但是原生的直播播放器涉及到编解码的过程,如果项目是以webview为主的 ,那么原生的播放器只能浮动在webview的上面 会遮挡住导航条和
一些webview的按钮,这样底下的东西都操作不到了。

解决方案
1.把播放器放在webview的下面,让webview透明过去,实践显示无法穿透
多层push过后的webview
2.h5 播放H264 ,目前据说效果不好。
3.h5 通过JSbridge拿到原生解码后的图像,显示成image 不断更新,数据量较大,
暂未尝试。
4.原生自己做挡住部分的按钮,和动画效果。
5.原生界面内嵌进入webview的层级关系里面

目前只有345方案稍微稳妥。
为了最大限度的节省代码,我尝试了第5种方案。
1.首先我分析了一下webview的层级关系,不会的看这个
2.发现他也是简简单单的subview而已,打印出来以后,我就在想,这些
webview 应该都是继承自uiview的 ,就算我不能修改他,但是addsubview
类似的操作还是能够做的。那我要做的就是遍历整个subview的所有uiview
然后做个打印
3.打印出来以后怎么找到我需要的那个视图呢,一般的做法是取拿属性列表,再打印
属性数值,这个太麻烦了,还不一定有,我的做法是直接把nslog的东西传给string
这样就和你打印的东西保持一致了。
4.最后怎么做呢,发现有的webview是有独特的class名称的。那么我就判断string是否
包含这个就好了。然后就把这个插入到视图中间去,就一下完成了内嵌。
5.最终没有选用这个方案的原因是安卓webview没有层级关系,效率肯定没咱ios好了。为了保持统一,我这思路做出来的东西最后不能用了。还是老老实实做皮肤层的方案4。
贴一下代码

-(void)traverseAllSubviews:(UIView *)view {
    for (UIView *subView in view.subviews) {
        if (subView.subviews.count) {
            [self traverseAllSubviews:subView];
        }

        if ([subView isKindOfClass:NSClassFromString(@"WKCompositingView")]) {
            NSLog(@"1111111%@",subView);
            NSString *string = [NSString stringWithFormat:@"%@",subView];
            if ([string containsString:@"component ipc-bottom"]) {
                NSLog(@"老子找到了");
                self.keypointView = subView.superview;
                [self.keypointView insertSubview:self.xplayCloudView belowSubview:subView];
                NSLog(@"老子找到了%@",self.keypointView.subviews);
                break;

            }
        }
    }
}

注意一下,做这个操作的时候别忘了要等页面push过去再做。苹果速度有点快,好像要等几秒再做遍历,不然react还没渲染就给遍历完了当然找不到了。图就不贴了,贴图会泄露机密,这个思路留给后面的人吧。

如果有人闲的话那可以试试第3种方案,看看是有多闲

猜你喜欢

转载自blog.csdn.net/github_35041937/article/details/80022145