iOS的QuickTime Plugin

当UIWebView播放视频时,可以看到viewhierarchy里有FigPluginView的身影。这个类来自于QuickTimePlugin,plugin的路径为:/Application

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

当UIWebView播放视频时,可以看到view hierarchy里有FigPluginView的身影。这个类来自于QuickTime Plugin,plugin的路径为:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Internet Plug-Ins/QuickTime Plugin.webplugin

这是个文件夹,里面还有链接库以及文件和图片资源。
QuickTime Plugin这个名字起得很响亮,其实代码并不多,Objective-C类只有9个,也就只是FigPluginView为主了。与WebKit.framework有耦合,或者说就是为了封装视频播放控件来给WebKit.framework用的。类关系如下图:

iOS的QuickTime Plugin

UIWebDocumentView会以成员变量struct __CFDictionary *_plugInViews来配对FigPluginView和UIWebPlugInView,其中FigPluginView为key,UIWebPlugInView为value。
UIWebPlugInView有成员变量UIView *_uiView指向FigPluginView,
FigPluginView有成员变量WAKView *_wakView指向UIWebPlugInView。

当然,视频只是PluginView的一种,UIWebPlugInView还会管理别的种类的plugin。

渲染流程中会有这样的关系:

iOS的QuickTime Plugin

RenderLayerBacking在更新layer树时,从RenderWidget出发通过几层关系得到UIWebPlugInView,调用其函数attachPluginLayer把FigPluginView添加到UIWebDocumentView中。注意这个“添加”是通过好多层CALayer间接实现的,UIWebPlugInView还会创建一个hostLayer作为MediaLayer。调用链的末端实现代码如下:

- (void)_connectPluginLayers  
{  
    WebThreadLock();  
    if (!_hostingLayer)  
    {  
        _hostingLayer = [[CALayer alloc] init];  
    }  
    [_webView.layer insertSublayer:_hostingLayer atIndex:0];  
    if ([[_webView webView] _setMediaLayer:_hostingLayer forPluginView:self])  
    {  
        self.parentedInLayer = YES;  
        [_uiView retain];  
        [_hostingLayer addSublayer:_uiView.layer];  
        [_uiView release];  
        [_webView _setSubviewCachesNeedUpdate:YES];  
        [self _reshapeOnMainThread];  
    }  
}  /* 何问起 hovertree.com */

这里只列个大概了,类间网状依赖,好难画图和用文字说明。总之可以更确定,WAKView就是替代了NSView,以求和Mac的WebView共用代码,但iOS application是单进程程序,只能用CALayer树来代替NSView树做组合了。

推荐:http://www.cnblogs.com/roucheng/p/3528371.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120479.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • wxPython的基础教程

    wxPython的基础教程写在前面的话:上个假期学习了Python,发现它真的是一门很有趣的语言,所以这学期想学一些python的可视化编程,于是选择了wxPython。但是我在网上找中文教程找了好久都没有找到中文的教程(额,也许是我方法不对),无奈只好看英文的啦。于是在这个网站上看完了wxPython的基础教程,但是为了方便广大网友所以决定将这个网页中的内容翻译过来。花费了3个晚上的时间,终于把它翻译完了。但是我只是一个

    2022年5月21日
    28
  • Sample rate 理解「建议收藏」

    Sample rate 理解「建议收藏」在Gnuradio中,我们可以看到很多模块中都有Samplerate这个概念然后看到一个说明 Anyprocessingblock’s’SampleRate’parameterisusedforDSPcalculation,notforcontrollingtherateatwhichsamplesareproduced.Thisisdis

    2022年10月17日
    3
  • navicat新建数据库_oracle数据库导入dmp

    navicat新建数据库_oracle数据库导入dmpNavicat连接oracle创建数据库,截图引导操作,简单上手

    2022年9月22日
    1
  • C++map的遍历_Map集合循环遍历的几种方式

    C++map的遍历_Map集合循环遍历的几种方式C++map遍历的几种方式#include<iostream>#include<unordered_map>usingnamespacestd;intmain(){unordered_map<string,int>mp;mp[“张三”]=20;mp[“李四”]=18;mp[“王五”]=30;//方式一、迭代器cout<<“方式一、迭代器”<&lt

    2022年9月21日
    5
  • Spring5.0源码学习系列之浅谈循环依赖问题

    Spring5.0源码学习系列之浅谈循环依赖问题

    2020年11月19日
    193
  • java链表打印_java链表打印

    java链表打印_java链表打印链表类packagecom.demo;publicclassNode{privateStringdata;privateNodenext;publicNode(Stringdata){this.data=data;}publicStringgetData(){returndata;}publicvoidsetData(Stringdata){this.data…

    2022年5月4日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号