Frame 布局

1,173 阅读2分钟
原文链接: www.jianshu.com

MMLayout

今天想介绍的就是开发中,布局的问题. 本人一直使用的传统的Frame来写UI 个人习惯,我觉得Frame 的效率还是比autolayout要高的,这个小伙伴可以测试一下的.

但是使用Frame 的时候 代码计算的时候很多,比如距离左边的控件的最大x值是多少,这样写来写去,实在代码可以不方便看,然后还的自己计算,很麻烦.

我自己整了一个 UIView的扩展 我相信类似的扩展大家都有的用 下面贴上代码!

@interface UIView (MM)
- (void)setX:(CGFloat)x;
- (CGFloat)x;
- (void)setY:(CGFloat)y;
- (CGFloat)y;
- (void)setW:(CGFloat)w;
- (CGFloat)w;
- (void)setH:(CGFloat)h;
- (CGFloat)h;
- (CGFloat)maxY;
- (CGFloat)minY;
- (CGFloat)maxX;
- (CGFloat)minX;
- (CGFloat)halfW;
- (CGFloat)halfH;
- (CGFloat)halfX;
- (CGFloat)halfY;
@end
@interface MMLayout : NSObject
-(instancetype)initWithLayoutView:(UIView *)LayoutView;
@property (assign , nonatomic) CGFloat top;    //上
@property (assign , nonatomic) CGFloat bottom; //下
@property (assign , nonatomic) CGFloat left;   //左
@property (assign , nonatomic) CGFloat right;  //右
@property (assign , nonatomic) CGFloat width;  //右
@property (assign , nonatomic) CGFloat height;  //右
@property (assign , nonatomic) CGSize  size;

//距离父控件中心  //<
- (void)center;
@end
@interface UIView (Layout)
//设置自己的Layout
- (void)make_Layout:(void(^)(MMLayout * layout))layout;
@end

最上面的UIView的扩展很简单,就是把x y 等等值简化的调用,

MMLayout这个Model类最后控制设置Frame

下面是简单的调用 下面的使用时在UIViewController 里面添加UI使用

-(void)viewDidLayoutSubviews{
    [self.yellowView make_Layout:^(MMLayout *layout) {
        layout.width = 100;
        layout.height = 200;
        layout.left = 5;
        layout.top = 100;
    }];
    __weak typeof(self)_self = self;
    [self.yellowViewTwo make_Layout:^(MMLayout *layout) {
    __strong typeof(_self)self = _self;
        layout.left = self.yellowView.maxX + 5;
        layout.top = self.yellowView.y;
        layout.size = self.yellowView.bounds.size;

    }];
    [self.yellowViewTree make_Layout:^(MMLayout *layout) {
        layout.height = 50;
        layout.width = 100;
        layout.right = 10;
        layout.top = 10;

    }];

}

平时在控制器写UI代码的时候布局的代码 我一般都会写在 - (void)viewDidLayoutSubviews

这个方法当控制器的View发生变化的时候会来到这个方法,比如一个场景,就是横竖屏的时候,你不用监听屏幕的旋转,只要在这里写上相对好的布局,横竖屏的时候会自己调用这个方法,从新的计算子控件的位置.

假设你在自定义View的时候在View的里面写布局的方法是 layoutSubviews 这个方法 父控件发生变化会调用LayoutSubViews

个人觉得,如果你用代码写aotolayout的话,有的时候更新约束,也是很麻烦的一件事.然后调试的时候,也会出现各种aotolayout的错误提示.

使用frame来写,避免了aotolayout的错误,错误率降低了.

话又说回来,autoLaout 确实很强大. 比如写UILabel的时候很方便,用frame写的话,还得计算text的size. 不过开发中,使用某一个东西,当然是有利有弊.这个还的根据大家的喜好,和公司的规范.来开发.

谢谢大家.

github.com/DemoDu/MMLa… 代码地址