1. 程式人生 > >iOS VirtualView框架結構

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 的結構十分類似。具體流程如下圖

 

 

 

 

 

analysis

 

 

 

解析完成,生成craters這個根節點的樹後,裝載屬性、生成邏輯上的元件層級關係、建立元件相應的NA coacaview,組裝成真正的NA View層級關係。

 

 

 

 

drawing

 

 

 

通過 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];

    }

}

 

至此,整個頁面層級關係構建完成,接著,資料到來重新整理介面展示及相關邏輯生效

 

完。。。。。