採用Masonry接口的高性能的佈局框架

緣由

在作開發的時候由於性能問題想把以前用Mansory的佈局修改爲絕對座標的frame模式,替換成本很大,因此想寫一個Mansory接口的frame佈局的框架,因此就有了VVLayout的出現,解決了替換問題,也解決自動佈局的性能問題。git

支持

  • 單個View
left、right、top、bottom、centerX、centerY、center、width、height、edges等
複製代碼
  • 數組View
/** * distribute with fixed spacing * * @param axisType 橫排仍是豎排 * @param fixedSpacing 兩個控件間隔 * @param leadSpacing 第一個控件與邊緣的間隔 * @param tailSpacing 最後一個控件與邊緣的間隔 */
- (void)distributeViewsAlongAxis:(VVAxisType)axisType withFixedSpacing:(CGFloat)fixedSpacing leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing;

/** * distribute with fixed item size * * @param axisType 橫排仍是豎排 * @param fixedItemLength 控件的寬或高 * @param leadSpacing 第一個控件與邊緣的間隔 * @param tailSpacing 最後一個控件與邊緣的間隔 */
- (void)distributeViewsAlongAxis:(VVAxisType)axisType withFixedItemLength:(CGFloat)fixedItemLength leadSpacing:(CGFloat)leadSpacing tailSpacing:(CGFloat)tailSpacing;

複製代碼

不支持

  • 不支持greaterThanOrEqualTo和lessThanOrEqualTo,UILabel替代方案lessHeightThatFits、greatHeightThatFits、lessWidthThatFits、greatWidthThatFits
  • 不支持屬性值連續鏈式調用,只能用一個。例如:width.height 或者 top.left.right。

例子

  • 兩個View的不包含
    alt Framer
[self.view1 makeLayout:^(VVMakeLayout *make) {
        make.width.vv_equalTo(100);
        make.height.vv_equalTo(100);
        make.center.equalTo(self.view);
    }];

    [self.view2 makeLayout:^(VVMakeLayout *make) {
        make.width.vv_equalTo(50.0f);
        make.height.vv_equalTo(50.0f);
        make.bottom.equalTo(self.view1.vv_top);
        make.left.equalTo(self.view1.vv_right).offset(20.0f);
    }];
複製代碼
  • 兩個View的包含
    alt Framer
[self.view1 makeLayout:^(VVMakeLayout *make) {
        make.width.vv_equalTo(100);
        make.height.vv_equalTo(100);
        make.center.equalTo(self.view);
    }];

    [self.view2 makeLayout:^(VVMakeLayout *make) {
        make.top.vv_equalTo(12.0f);
        make.bottom.vv_equalTo(-14.0f);
        make.left.vv_equalTo(16.0f);
        make.width.equalTo(self.view1.vv_height).multipliedBy(0.5f);
    }];
複製代碼
  • 自動計算高度、寬度等
    alt Framer
self.label.text = @"分塊下載還有一個比較使用的場景是斷點續傳,能夠將文件分爲若干個塊,"
                      "而後維護一個下載狀態文件用以記錄每個塊的狀態,這樣即便在網絡中斷後,"
                      "也能夠恢復中斷前的狀態,具體實現讀者能夠本身嘗試一下,仍是有一些細節需"
                      "要特別注意的,好比分塊大小多少合適?下載到一半的塊如何處理?要不要維護"
                      "一個任務隊列";
    [self.label makeLayout:^(VVMakeLayout *make) {
        make.center.equalTo(self.view);
        make.width.vv_equalTo(200.0f);
        make.lessHeightThatFits(CGFLOAT_MAX);
    }];
複製代碼
  • view的更新
[self.view1 updateLayout:^(VVMakeLayout *make) {
        make.top.offset(100);
    }];
複製代碼
  • view的從新佈局
[self.view1 remakeLayout:^(VVMakeLayout *make) {
        make.top.equalTo(@200);
        make.centerX.offset(0.0f);
        make.size.vv_equalTo(CGSizeMake(100, 100));
    }];
複製代碼

VVLayout

  1. 支持Masonry基本接口的方法
  2. 底層採用Frame佈局方式
  3. 支持按手機屏幕適配大小

使用

pod 'VVLayout'github

感謝

相關文章
相關標籤/搜索