Latest 0.1.1
Homepage https://github.com/xiaobinlzy/DLLLayout
License MIT
Platforms ios 6.0
Authors

CI Status
Version
License
Platform

Introduce

DLLLayout 是一个基于 UIView.frame 的轻量级 iOS 布局框架。相比苹果的 AutoLayout,它有着更友善的 API 和更高的性能,虽然功能上不如 AutoLayout 大又全,比如不支持 greaterThan、lesserThan、priority 等,但也能够满足90%以上的业务场景。在性能上,如果需要通过视图内容自适应宽高(例如 UILabel、UIButton 根据内容计算宽高),布局耗时为苹果 AutoLayout 的 1/2 左右;反之如果设置了视图的宽高,布局耗时只有苹果 AutoLayout 的不到 1/8,并且能够兼容 UIView.transform。

Theory

给 UIView 设置布局规则,通过 hook UIView.layoutSubviews,在这个方法里对设置过布局规则的视图设置 frame,实现布局功能。因为布局活动触发在系统的 layoutSubviews 之前,所以仍然可以通过重写子类的 layoutSubviews 来实现自己的布局。

Example

克隆仓库后,在Example目录下先运行 pod install,就可以运行演示工程。

Requirement

iOS 6.0 +

Installation

DLLLayout 可以通过 CocoaPods 获得。 只需要在你的 Podfile 中添加如下代码:

pod "DLLLayout"

Usage

通常来说,一个视图的布局是一个矩形,所以需要能够得到四条边的位置才能够进行布局。但是一些视图,不如 UILabel、UIButton、UIImageView 等等,需要根据它们的内容来自动计算宽高,那么如果我们对这些视图不设置足够的条件,也会根据他们的内容自动计算出布局所用的宽高,不过这样会有一定的性能消耗。如果不能够得到视图四边的位置,则会抛出异常。

在 UIView 实例化之后就可以对它设置布局规则,不需要像 AutoLayout 一样先加入到视图层级中再设置。

    UIView *view = [[UIView alloc] init];
    // 给 view 设置布局规则
    [view dll_setLayout:^(DLLLayout *layout) {
        layout.width(100)   // 宽度100
        .height(50) // 高度50
        .centerX(0) // x轴在父视图居中 偏移量0
        .topMargin(50); // 相对父视图顶边距50
    }];

也可以设置视图的相对依赖关系。注意:只能依赖同一视图层级下的子视图,或者是自己的父、子视图。

    UIView *containerView = [[UIView alloc] init];
    containerView.backgroundColor = [UIColor redColor];
    UIView *leftInnerView = [[UIView alloc] init];
    leftInnerView.backgroundColor = [UIColor yellowColor];
    UIView *rightInnerView = [[UIView alloc] init];
    rightInnerView.backgroundColor = [UIColor blueColor];
    [containerView addSubview:leftInnerView];
    [containerView addSubview:rightInnerView];
    // containerView是父视图,leftInnerView和rightInnerView是两个子视图

    // 父视图宽度300,高度100,x和y都居中
    [containerView dll_setLayout:^(DLLLayout *layout) {
        layout.width(300)
        .height(100)
        .centerX(0)
        .centerY(0);
    }];

    // leftInnerView的宽度是父视图宽度的0.5倍少15,高度比父视图的高度少20,左边距10,y轴居中
    [leftInnerView dll_setLayout:^(DLLLayout *layout) {
        layout.relative.width.to(containerView.dll_width.multiple(0.5).offset(-15))
        .relative.height.to(containerView.dll_height.offset(-20))
        .leftMargin(10)
        .centerY(0);
    }];

    // leftInnerView的宽度是父视图宽度的0.5倍少15,高度比父视图的高度少20,右边距10,y轴居中
    [rightInnerView dll_setLayout:^(DLLLayout *layout) {
        layout.relative.width.to(containerView.dll_width.multiple(0.5).offset(-15))
        .relative.height.to(leftInnerView.dll_height)
        .rightMargin(10)
        .centerY(0);
    }];

在 UIViewAnimation 中,因为要实时更新视图的 frame,所以在使用 DLLLayout 更新布局规则之后,需要手动调用 dll_updateFrame 方法来立即更新 frame。

    [UIView animateWithDuration:0.25 animations:^{
        [view dll_updateLayout:^(DLLLayout *layout) {
            layout.width(300);
        }];
        // 更新布局规则之后,手动调用dll_updateFrame方法,立即更新frame。
        [view dll_updateFrame];
    }];

Feature

  1. 比 Auto Layout 性能更高。
  2. 支持 Affine Transform。

Author

xiaobinlzy, [email protected]

License

DLLLayout is available under the MIT license. See the LICENSE file for more info.

Update Log

0.1.1

支持 UIView.transform。

Latest podspec

{
    "name": "DLLLayout",
    "version": "0.1.1",
    "summary": "DLLLayout u662fu4e00u4e2au57fau4e8e UIView.frame u7684u8f7bu91cfu7ea7 iOS u5e03u5c40u6846u67b6u3002",
    "description": "DLLLayout u662fu4e00u4e2au57fau4e8e UIView.frame u7684u8f7bu91cfu7ea7 iOS u5e03u5c40u6846u67b6u3002u76f8u6bd4u82f9u679cu7684 AutoLayoutuff0cu5b83u6709u7740u66f4u53cbu5584u7684 API u548cu66f4u9ad8u7684u6027u80fduff0cu867du7136u529fu80fdu4e0au4e0du5982 AutoLayout u5927u53c8u5168uff0cu6bd4u5982u4e0du652fu6301 greaterThanu3001lesserThanu3001priority u7b49uff0cu4f46u4e5fu80fdu591fu6ee1u8db390%u4ee5u4e0au7684u4e1au52a1u573au666fu3002u5728u6027u80fdu4e0auff0cu5982u679cu9700u8981u901au8fc7u89c6u56feu5185u5bb9u81eau9002u5e94u5bbdu9ad8uff08u4f8bu5982 UILabelu3001UIButton u6839u636eu5185u5bb9u8ba1u7b97u5bbdu9ad8uff09uff0cu5e03u5c40u8017u65f6u4e3au82f9u679c AutoLayout u7684 1/2 u5de6u53f3uff1bu53cdu4e4bu5982u679cu8bbeu7f6eu4e86u89c6u56feu7684u5bbdu9ad8uff0cu5e03u5c40u8017u65f6u53eau6709u82f9u679c AutoLayout u7684u4e0du5230 1/8u3002nu7ed9 UIView u8bbeu7f6eu5e03u5c40u89c4u5219uff0cu901au8fc7 hook UIView.layoutSubviewsuff0cu5728u8fd9u4e2au65b9u6cd5u91ccu5bf9u8bbeu7f6eu8fc7u5e03u5c40u89c4u5219u7684u89c6u56feu8bbeu7f6e frameuff0cu5b9eu73b0u5e03u5c40u529fu80fdu3002u56e0u4e3au5e03u5c40u6d3bu52a8u89e6u53d1u5728u7cfbu7edfu7684 layoutSubviews u4e4bu524duff0cu6240u4ee5u4ecdu7136u53efu4ee5u901au8fc7u91cdu5199u5b50u7c7bu7684 layoutSubviews u6765u5b9eu73b0u81eau5df1u7684u5e03u5c40u3002",
    "homepage": "https://github.com/xiaobinlzy/DLLLayout",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    },
    "authors": {
        "xiaobinlzy": "[email protected]"
    },
    "source": {
        "git": "https://github.com/xiaobinlzy/DLLLayout.git",
        "tag": "0.1.1"
    },
    "platforms": {
        "ios": "6.0"
    },
    "source_files": "DLLLayout/**/*",
    "public_header_files": [
        "DLLLayout/DLLLayout.h",
        "DLLLayout/DLLLayoutDefine.h",
        "DLLLayout/UIView+DLLLayout.h",
        "DLLLayout/DLLLayoutRelativeMaker.h",
        "DLLLayout/DLLLayoutRelative.h"
    ]
}

Pin It on Pinterest

Share This