這篇文章主要是對Weex iOS端源碼中的佈局原理進行分析,並根據原理寫了一個Demo,歡迎你們進行交流溝通。css
Layout是FaceBook開源的一個跨端CSS佈局引擎。 Weex 引入了Layout 在原來的基礎上進行命名空間上的調整, Layout在Weex中主要是做爲一個CSS參數的容器,對CSS的參數的管理。node
Layout源碼由C語言編寫,主要包含能夠存儲CSS參數的結構體、枚舉,以及一些相關的C函數。 一、結構體、枚舉 Layout.h文件中聲明瞭對應於CSS屬性的一些結構體和枚舉體 如:git
css_style_t
css_layout_t
css_node_t
css_direction_t
css_flex_direction_t
css_justify_t
css_align_t
css_position_type_t
css_wrap_type_t
css_position_t
···
複製代碼
對CSS有了解的夥伴能夠看出,這些結構體的命名上和CSS的屬性是相對應的 其中比較核心的一個數據結構體是css_node_t
,裏面包含了CSS佈局須要的大部分參數: github
二、C函數 layout中實現了一些管理css_node_t
等結構體的生命週期的C函數:bash
css_node_t *new_css_node(void);
void init_css_node(css_node_t *node);
void free_css_node(css_node_t *node);
void layoutNode(css_node_t *node, float maxWidth, float maxHeight, css_direction_t parentDirection);
void resetNodeLayout(css_node_t *node);
複製代碼
這些函數包括了初始化、析構、重置等功能。weex
Weex經過JSContext讓APP與JS進行交互,相關載入的數據經過JSValue進行載入。 JSValue數據結構大體以下:數據結構
{
attr = {
data-v-e9c9dede = ;
};
style = {
bottom = 48wx;
position = absolute;
width = 0;
left = 0;
top = 0;
opacity = 0;
backgroundColor = rgba(0,0,0,0.5);
};
type = div;
event = (
click
);
ref = 558;
}
複製代碼
經過JS獲取JSValue: 函數
css_node_t
在獲取JSValue以後經過toDictionary
方法轉化成原生直接可用的NSDictionary格式的數據。 再將NSDictionary數據轉換到css_node_t中 Weex中封裝了一些宏用於轉換,如:佈局
WX_STYLE_FILL_CSS_NODE
WX_STYLE_FILL_CSS_NODE_PIXEL
WX_STYLE_FILL_CSS_NODE_ALL_DIRECTION
複製代碼
這些宏主要是獲取NSDictionary中各個key的value(即CSS屬性的數據)計算成原生布局可用的數據,存入css_node_t
中對應的成員裏。 Weex提供了一些方法將CSS屬性的數據計算轉換成佈局可用的數據: 例如數值轉換: flex
+ (CGFloat)CGFloat:(id)value
方法就是將其轉換成原生布局能夠用的數值。
須要佈局時,從css_node_t
取出數據,對View進行佈局。 如:
css_node_t
中取出數據,計算出frame(即View的位置和大小),進行佈局
在layout中實現了一個比較函數eq
:
static bool eq(float a, float b) {
if (isUndefined(a)) {
return isUndefined(b);
}
return fabs(a - b) < 0.0001;
}
複製代碼
從中能夠看出,因此在weex中佈局相關數值的精確度誤差最低爲0.0001,如0.00011和0.00019在weex佈局中視爲同樣。
從源碼能夠看出,