zoukankan      html  css  js  c++  java
  • Masonry使用详解

    • mas_makeConstraints 只负责新增约束 Autolayout不能同时存在两条针对于同一对象的约束 否则会报错

    • mas_updateConstraints 针对上面的情况 会更新在block中出现的约束 不会导致出现两个相同约束的情况

    • mas_remakeConstraints 则会清除之前的所有约束 仅保留最新的约束

    • equalTo 和 mas_equalTo的区别在哪里呢? 其实 mas_equalTo是一个MACRO,比较的是值,equalTo比较的是view。

    宽高相等: 

    make.width.offset(marginHeight);

     make.height.mas_equalTo(timeImg.mas_width).multipliedBy(1);

    1. [基础] 居中显示一个view

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
         
        WS(ws);
         
        UIView *sv = [UIView new];
        [sv showPlaceHolder];
        sv.backgroundColor = [UIColor blackColor];
        [self.view addSubview:sv];
        [sv mas_makeConstraints:^(MASConstraintMaker *make) {
            make.center.equalTo(ws.view);
            make.size.mas_equalTo(CGSizeMake(300, 300));
        }];
         
    }
    2. [初级] 让一个view略小于其superView(边距为10)
    UIView *sv1 = [UIView new];
    [sv1 showPlaceHolder];
    sv1.backgroundColor = [UIColor redColor];
    [sv addSubview:sv1];
    [sv1 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
         
        /* 等价于
        make.top.equalTo(sv).with.offset(10);
        make.left.equalTo(sv).with.offset(10);
        make.bottom.equalTo(sv).with.offset(-10);
        make.right.equalTo(sv).with.offset(-10);
        */
         
        /* 也等价于
        make.top.left.bottom.and.right.equalTo(sv).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
        */
    }];
    3. [初级] 让两个高度为150的view垂直居中且等宽且等间隔排列 间隔为10(自动计算其宽度)
    int padding1 = 10;
    [sv2 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(sv.mas_centerY);
        make.left.equalTo(sv.mas_left).with.offset(padding1);
        make.right.equalTo(sv3.mas_left).with.offset(-padding1);
        make.height.mas_equalTo(@150);
        make.width.equalTo(sv3);
    }];
    [sv3 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.mas_equalTo(sv.mas_centerY);
        make.left.equalTo(sv2.mas_right).with.offset(padding1);
        make.right.equalTo(sv.mas_right).with.offset(-padding1);
        make.height.mas_equalTo(@150);
        make.width.equalTo(sv2);
    }];
    4. [中级] 在UIScrollView顺序排列一些view并自动计算contentSize
     
        UIScrollView *contextSV = [UIScrollView new];
        contextSV.backgroundColor = [UIColor greenColor];
        contextSV.pagingEnabled = YES;
        [self.view addSubview:contextSV];
        [contextSV mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.offset(0);
            make.right.offset(0);
            make.top.offset(0);
            make.bottom.offset(-49.0f);
        }];
        
        UIView *contentView = [UIView new];
        [contextSV addSubview:contentView];
        [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.offset(0);
            make.right.offset(0);
            make.top.offset(0);
            make.bottom.offset(0);
            make.height.equalTo(contextSV.mas_height);
        }];
        
        UIView *nextView = nil;
        for (int i = 0 ; i < 10; i++)
        {
            UIView *view = [UIView new];
            view.backgroundColor = [UIColor colorWithRed:(arc4random()%256/255.0f) green:(arc4random()%256/255)  blue:(arc4random()%256/255)  alpha:1];
            [contentView addSubview:view];
            [view mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.offset(0);
                make.bottom.offset(0);
                if (i == 0) {
                    make.left.offset(0);
                }else{
                    make.left.equalTo(nextView.mas_right).offset(0);
                }
                if (i == 9) {
                    make.right.offset(0);
                }
                make.width.equalTo(contextSV.mas_width);
            }];
            nextView = view;
        }
        [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.equalTo(nextView.mas_right);
        }];

        


    5. [高级] 横向或者纵向等间隙的排列一组view
    @implementation UIView(Masonry_LJC)
    - (void) distributeSpacingHorizontallyWith:(NSArray*)views
    {
        NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
         
        for ( int i = 0 ; i < views.count+1 ; ++i )
        {
            UIView *v = [UIView new];
            [spaces addObject:v];
            [self addSubview:v];
             
            [v mas_makeConstraints:^(MASConstraintMaker *make) {
                make.width.equalTo(v.mas_height);
            }];
        }    
         
        UIView *v0 = spaces[0];
         
        __weak __typeof(&*self)ws = self;
         
        [v0 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(ws.mas_left);
            make.centerY.equalTo(((UIView*)views[0]).mas_centerY);
        }];
         
        UIView *lastSpace = v0;
        for ( int i = 0 ; i < views.count; ++i )
        {
            UIView *obj = views[i];
            UIView *space = spaces[i+1];
             
            [obj mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(lastSpace.mas_right);
            }];
             
            [space mas_makeConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(obj.mas_right);
                make.centerY.equalTo(obj.mas_centerY);
                make.width.equalTo(v0);
            }];
             
            lastSpace = space;
        }
         
        [lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.equalTo(ws.mas_right);
        }];
         
    }
    - (void) distributeSpacingVerticallyWith:(NSArray*)views
    {
        NSMutableArray *spaces = [NSMutableArray arrayWithCapacity:views.count+1];
         
        for ( int i = 0 ; i < views.count+1 ; ++i )
        {
            UIView *v = [UIView new];
            [spaces addObject:v];
            [self addSubview:v];
             
            [v mas_makeConstraints:^(MASConstraintMaker *make) {
                make.width.equalTo(v.mas_height);
            }];
        }
         
         
        UIView *v0 = spaces[0];
         
        __weak __typeof(&*self)ws = self;
         
        [v0 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(ws.mas_top);
            make.centerX.equalTo(((UIView*)views[0]).mas_centerX);
        }];
         
        UIView *lastSpace = v0;
        for ( int i = 0 ; i < views.count; ++i )
        {
            UIView *obj = views[i];
            UIView *space = spaces[i+1];
             
            [obj mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(lastSpace.mas_bottom);
            }];
             
            [space mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(obj.mas_bottom);
                make.centerX.equalTo(obj.mas_centerX);
                make.height.equalTo(v0);
            }];
             
            lastSpace = space;
        }
         
        [lastSpace mas_makeConstraints:^(MASConstraintMaker *make) {
            make.bottom.equalTo(ws.mas_bottom);
        }];
    }
    @end
     
     
     
     
     
     
    UIView *sv11 = [UIView new];
    UIView *sv12 = [UIView new];
    UIView *sv13 = [UIView new];
    UIView *sv21 = [UIView new];
    UIView *sv31 = [UIView new];
    sv11.backgroundColor = [UIColor redColor];
    sv12.backgroundColor = [UIColor redColor];
    sv13.backgroundColor = [UIColor redColor];
    sv21.backgroundColor = [UIColor redColor];
    sv31.backgroundColor = [UIColor redColor];
    [sv addSubview:sv11];
    [sv addSubview:sv12];
    [sv addSubview:sv13];
    [sv addSubview:sv21];
    [sv addSubview:sv31];
    //给予不同的大小 测试效果
    [sv11 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerY.equalTo(@[sv12,sv13]);
        make.centerX.equalTo(@[sv21,sv31]);
        make.size.mas_equalTo(CGSizeMake(40, 40));
    }];
    [sv12 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(70, 20));
    }];
    [sv13 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(50, 50));
    }];
    [sv21 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(50, 20));
    }];
    [sv31 mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(40, 60));
    }];
    [sv distributeSpacingHorizontallyWith:@[sv11,sv12,sv13]];
    [sv distributeSpacingVerticallyWith:@[sv11,sv21,sv31]];
    [sv showPlaceHolderWithAllSubviews];
    [sv hidePlaceHolder];
     使用masonary就行九宫格布局:
    -(void)viewDidLoad{
        _topScrollButtonTitleArr=[[NSMutableArray alloc] initWithObjects:@"推荐", @"青春", @"淑女", @"女鞋", @"配饰", @"女包", @"泳装", @"内衣", @"婚礼", @"大码", @"老公" ,@"妈妈", @"爸爸", @"孕妇", @"男孩", @"女孩", @"生活", nil];
        
        
        __block MainChoseLabel *nextLabel=nil;
        for (int i=0;i<_topScrollButtonTitleArr.count;i++) {
            MainChoseLabel *mainLabel=[MainChoseLabel new];
            [self.view addSubview:mainLabel];
            mainLabel.backgroundColor=[UIColor redColor];
            mainLabel.text=_topScrollButtonTitleArr[i];
            int col=i%4;
            [mainLabel mas_updateConstraints:^(MASConstraintMaker *make) {
                if(nextLabel){
                    if(col==0){
                        make.left.offset(10);
                    }else{
                       
                        make.left.equalTo(nextLabel.mas_right).offset(10);
                    }
                     make.width.equalTo(nextLabel);
                    
                    if(((i+1)%4)==0){
                        make.right.offset(-10);
                        NSLog(@"---");
                    }
                }else{
                    make.left.offset(10);
                }
                
                
                make.height.offset(44);
                make.top.offset((10+44)*(i/4)+30);
                
            }];
            
            nextLabel=mainLabel;
        }
    }

     
    mas scrollview布局
    _bigScrollView=[UIScrollView new];
        _bigScrollView.pagingEnabled=YES;
        _bigScrollView.delegate=self;
        [self.view addSubview:_bigScrollView];
        
        [_bigScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
    //        make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(120,5,5,5));
            make.top.top.offset(0);
            make.bottom.offset(0);
            make.left.offset(0);
            make.right.offset(0);
        }];
        _bigScrollView.backgroundColor=[UIColor redColor];
        UIView *container = [UIView new];
        [_bigScrollView addSubview:container];
        container.backgroundColor=[UIColor redColor];
        [container mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(_bigScrollView);
            make.height.equalTo(_bigScrollView);
        }];

        int count = 10;
        UIView *lastView = nil;
        for ( int i = 1 ; i <= count ; ++i )
        {
            UIView *subv = [UIView new];
            [container addSubview:subv];
            
            subv.backgroundColor = [UIColor colorWithHue:( arc4random() % 256 / 256.0 )
                                              saturation:( arc4random() % 128 / 256.0 ) + 0.5
                                              brightness:( arc4random() % 128 / 256.0 ) + 0.5
                                                   alpha:1];
            [subv mas_makeConstraints:^(MASConstraintMaker *make) {
                make.top.and.bottom.equalTo(container);
                make.width.mas_equalTo(_bigScrollView);
                if (lastView)
                {
                    make.left.mas_equalTo(lastView.mas_right);
                }
                else
                {
                    make.left.mas_equalTo(container.mas_left);
                }
            }];
            
            lastView = subv;
        }
        [container mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.equalTo(lastView.mas_right);
        }];
     
     
     
     
     
  • 相关阅读:
    学习篇之函数就是对象
    @Controller和@RestController的区别
    maven 阿里云 国内镜像 中央仓库
    IntelliJ IDEA使用教程
    解决“无法从套接字读取更多数据”
    at java.util.Arrays.copyOfRange(Arrays.java:3209)导致的java.lang.OutOfMemoryError: Java heap space 错误的解决办法
    maven中引入ojdbc包
    Oralce增加表空间
    Web服务框架发展与REST服务开发
    Oralce解锁表
  • 原文地址:https://www.cnblogs.com/hualuoshuijia/p/5007708.html
Copyright © 2011-2022 走看看