iOS的QuickTime Plugin
2016-05-30 12:48
459 查看
当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。调用链的末端实现代码如下:
这里只列个大概了,类间网状依赖,好难画图和用文字说明。总之可以更确定,WAKView就是替代了NSView,以求和Mac的WebView共用代码,但iOS application是单进程程序,只能用CALayer树来代替NSView树做组合了。
推荐:http://www.cnblogs.com/roucheng/p/3528371.html
/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]; } } /* 何问起 hovertree.com */
这里只列个大概了,类间网状依赖,好难画图和用文字说明。总之可以更确定,WAKView就是替代了NSView,以求和Mac的WebView共用代码,但iOS application是单进程程序,只能用CALayer树来代替NSView树做组合了。
推荐:http://www.cnblogs.com/roucheng/p/3528371.html
相关文章推荐
- UITableViewCell上的按钮点击事件处理
- ERROR: Remote error: BdbQuit 的解决办法
- 【iOS开发】自定义UIView边框的颜色
- View生命周期
- [leetcode] 128. Longest Consecutive Sequence
- request.getParameter(“参数名”) 中文乱码解决方法
- iOS开发中UIWindow
- 百度UEditor插入图片尺寸自动适应编辑框大小问题
- JS 生成GUID
- RK3066开发板的唯一码UUID
- UIScrollView添加AutoLayout的ambiguous content size警告解决方法
- kernel_require.rb:55:in `require': cannot load such file -- mach (LoadError)
- Java设计模式之建造者模式(Builder)
- 【iOS开发】UIViewController之间的切换动画效果
- saiku前端query.js
- [已解决]Warning:Gradle version 2.10 is required. Current version is 2.4.
- requirejs:模块加载(require)及定义(define)时的路径小结
- Value '0000-00-00' can not be represented as java.sql.Date
- Android高级UI ViewFlipper左右滑屏切换页面
- ue4 笔记