iOS的QuickTime Plugin

标签: iOSWebKitFigPluginViewUIWebPlugInViewWidget
5400人阅读 评论(16) 收藏 举报
分类:
当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用的。类关系如下图:


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

当然,视频只是PluginView的一种,UIWebPlugInView还会管理别的种类的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];
    }
}

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1013711次
    • 积分:9432
    • 等级:
    • 排名:第2013名
    • 原创:173篇
    • 转载:0篇
    • 译文:0篇
    • 评论:539条
    联系方式
    博客专栏
    最新评论