自己写个比Masonry好用的iOS布局实现

 

Masonry 使用的时候需要先addSubView。

使用方法是:

    [myView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.height.mas_equalTo(99.5 - 64);//设置高
        make.width.mas_equalTo(ScreenWidth);//设置宽
        make.top.mas_equalTo(navi.bottom);//设置顶部
    }];
    [label mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(searchView.height/2.0) ;//纵向中心
        make.width.mas_equalTo (ScreenWidth/2.0);//宽
        make.left.mas_equalTo(0);//左
    }];
    [sLine mas_makeConstraints:^(MASConstraintMaker *make) {
        make.width.mas_equalTo(49);
        make.height.mas_equalTo(2);
        make.centerX.mas_equalTo(label.mas_centerX);//另一个控件的横向中心
        make.bottom .mas_equalTo(search.mas_bottom);//另一个控件的底部
    }];

Masonry优点是整洁。

 

 

使用扩展(Uiview+Addional.m)的方式书写布局

    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.image = [UIImage imageNamed:@"pic.png"];
    imageView.width = 95;
    imageView.height = 69;
    if(imageViewTop > 0 ) {
        imageView.top = imageViewTop;
    }else{
        imageView.bottom = ScreenHeight / 3.0 ;
    }

 

扩展的功能是每次只对上下左右的其中一个进行更改。

缺点是代码行数一多就感觉可能比较乱,而且再加上其他逻辑显得没有那么整洁。

 

扩展的实现也很简单:

Uiview+Addional.m 部分

- (CGFloat)width {
    return self.frame.size.width;
}

- (void)setWidth:(CGFloat)width {
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)height {
    return self.frame.size.height;
}

- (void)setHeight:(CGFloat)height {
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

 

 

那可不可以将这两种结合起来呢?

当然可以

 

先看效果:

    UILabel *label = [[UILabel alloc] init];
    [label setTitleAndOther];
    [label mas_makeConstraintS:^(MASConsTraintMaker *make) {//类似的整洁
        make.top = 100;
        make.center = self.view.zeroCenter;//zeroCenter直接设置子控件位于父控件中心
        make.autoRight = titleLabel.right ;//autoRight直接自动计算控件的宽度
    }];
    [self.view addSubview:label];

 

既不会内存泄漏,也保持了Masonry的整洁,又使用了方便的扩展书写方式。

 

部分实现代码:


#import 

NS_ASSUME_NONNULL_BEGIN

@interface UIView (likeMas)
- (void)mas_makeConstraintS:(PublicBlock)make;
@end

NS_ASSUME_NONNULL_END
#import "UIView+likeMas.h"

@implementation UIView (likeMas)
- (void)mas_makeConstraintS:(PublicBlock)make{
    make(self);
}
@end
//
- (CGFloat)autoRight{
    return self.right;
}
// 如果没有设置width 自动设置
- (void)setAutoRight:(CGFloat)right {
    CGRect frame = self.frame;
    frame.size.width = right - self.left;
    frame.origin.x = right - frame.size.width;
    self.frame = frame;
}
//居中
- (void)setZeroCenter:(CGPoint)zeroZeroCenter_{
    self.zeroCenter = zeroZeroCenter_;
}
- (CGPoint)zeroCenter{
    return CGPointMake(self.width/2.0, self.height/2.0);
}

 

 

示例工程:

https://download.csdn.net/download/qq_15509071/12489148

 

你可能感兴趣的:(ios)