iOS VirtualView框架結構
VirtualView 簡單總結起來就是用 XML 描述一個元件,用我們提供的工具編譯成 .out 二進位制檔案,在集成了 VirtualView 的 App 裡直接載入 .out 檔案就可以得到一個元件,然後像使用普通 UIView 一樣使用它就好了。
框架解決具體問題:
1.頁面動態性
2.提升效能,虛擬元件,減少頁面層級,layer元件
先從整體上預覽一下整個方案的大體結構:
具體產品流程
.out檔案資料段分組格式如下圖:
格式 |
具體描述 |
備註 |
---|---|---|
ALIVV字串 | 開頭標識位 | |
major |
標記版本號 | |
minor |
標記版本號 | |
patch |
標記版本號 | |
mainLocation |
元件區起始位置 | 頁面層級節點描述,樹形結構 |
mainSize |
元件區長度 | |
stringLocation |
字串區起始位置 | 自定義的字串除重,[hashid,@"string"] |
stringSize |
字串區長度 | |
exprLocation |
deprecated |
|
exprSize |
deprecated |
|
extraLocation |
deprecated |
|
extraSize |
deprecated |
本地X.out檔案讀取解析過程;根據檔案元件的資料描述讀取分段的資料,並且構造VVNodeCreater 的結構, VVNodeCreater和XML 的結構十分類似。具體流程如下圖
解析完成,生成craters這個根節點的樹後,裝載屬性、生成邏輯上的元件層級關係、建立元件相應的NA coacaview,組裝成真正的NA View層級關係。
通過 rootnode 建立VVViewContainer的子view或是子layer
_rootNode.rootCanvasLayer = self.layer;
_rootNode.rootCocoaView = self;
基類 VVBaseNode 實現如下,又是一個遞迴呼叫
- (void)setRootCocoaView:(UIView *)rootCocoaView
{
_rootCocoaView = rootCocoaView;
for (VVBaseNode *subNode in self.subNodes) {
subNode.rootCocoaView = rootCocoaView;
}
}
- (void)setRootCanvasLayer:(CALayer *)rootCanvasLayer
{
_rootCanvasLayer = rootCanvasLayer;
for (VVBaseNode *subNode in self.subNodes) {
subNode.rootCanvasLayer = rootCanvasLayer;
}
}
NVVHLayout 容器元件 繼承自VVBaseNode
- (void)setRootCocoaView:(UIView *)rootCocoaView
{
_rootCocoaView = rootCocoaView;
if (self.cocoaView.superview != rootCocoaView) {
if (self.cocoaView.superview) {
[self.cocoaView removeFromSuperview];
}
[rootCocoaView addSubview:self.cocoaView];
}
for (VVBaseNode *subNode in self.subNodes) {
subNode.rootCocoaView = self.cocoaView;
}
}
- (void)setRootCanvasLayer:(CALayer *)rootCanvasLayer
{
_rootCanvasLayer = rootCanvasLayer;
for (VVBaseNode *subNode in self.subNodes) {
subNode.rootCanvasLayer = self.cocoaView.layer;
}
}
控制元件元件 NVTextView 繼承自VVBaseNode
- (void)setRootCocoaView:(UIView *)rootCocoaView
{
if (self.cocoaView.superview != rootCocoaView) {
if (self.cocoaView.superview) {
[self.cocoaView removeFromSuperview];
}
[rootCocoaView addSubview:self.cocoaView];
}
[super setRootCocoaView:rootCocoaView];
}
並且遞迴拿到所有的有表示式和action的node
+ (void)private_variableNodes:(VVBaseNode *)node result:(NSMutableArray *)result
{
if (node.expressionSetters.count > 0 || (node.action && node.action.length > 0)) {
[result addObject:node];
}
for (VVBaseNode *subNode in node.subNodes) {
[self private_variableNodes:subNode result:result];
}
}
至此,整個頁面層級關係構建完成,接著,資料到來重新整理介面展示及相關邏輯生效
完。。。。。