iOS masonry九宫格 单行 多行布局

Masonry是个好东西,在当前尺寸各异的iOS开发适配中发挥着至关重要的作用,由于项目中Masonry布局用的比较多,对于UI布局也有了一些自己的理解,经常会有人问道Masonry布局九宫格要怎么布局呢,单行、多行要怎么做到自动布局呢,之前用frame布局九宫格需要2层for循环,各种判断才可以完成一套九宫格布局,那使用Masonry是不是也这么麻烦呢,答案是否定的!下面把Masonry布局单行,多行的代码贴出来,注释的很详细,有需要的同学可以参考参考,可能对于Masonry的使用会有不一样的理解。

图片

代码

//
//  ViewController.m
//  SudokuLayout
//
//  Created by Tiny on 2017/12/29.
//  Copyright ? 2017年 hxq. All rights reserved.
//

#import "ViewController.h"
#import "Masonry.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //如果需要考虑横竖屏可以将布局代码写在LayoutSubViews这个方法中
    //九宫格布局单行
    [self layoutOneLine];

    //九宫格布局多行 其实跟单行布局差不多,唯一要注意的是要判断换行的问题  为了体现差异,把两种单独写 代码确实有大量重复的
    //多行布局是支持单行的
    [self layoutMultiLine];

    //分析了代码可以看出来 多行布局和单行布局其实没有什么特殊的地方
    //区别点 1.确定什么时候换行
    //      2.确定距离布局区域顶部的距离多少
    //当前在真是开发环境中还会存在各种差异,但是只要理解了布局思路,相信不管怎么样布局都会游刃有余

}

-(void)layoutOneLine{
    //单行布局 不需要考虑换行的问题

    CGFloat marginX = 10;  //按钮距离左边和右边的距离
    CGFloat marginY = 10;  //按钮距离布局顶部的距离
    CGFloat toTop = 50;  //布局区域距离顶部的距离
    CGFloat gap = 10;    //按钮与按钮之间的距离
    NSInteger col = 5;    //这里只布局5列
    NSInteger count = 5;  //这里先设置布局5个按钮

    CGFloat viewWidth = self.view.bounds.size.width;  //视图的宽度
    CGFloat viewHeight = self.view.bounds.size.height;  //视图的高度

    CGFloat itemWidth = (viewWidth - marginX *2 - (col - 1)*gap)/col*1.0f;  //根据列数 和 按钮之间的间距 这些参数基本可以确定要平铺的按钮的宽度
    CGFloat height = itemWidth;   //按钮的高度可以根据情况设定 这里设置为相等

    UIButton *last = nil;   //上一个按钮
    //准备工作完毕 既可以开始布局了
    for (int i = 0 ; i < count; i++) {
        UIButton *item = [self buttonCreat];
        [item setTitle:@(i).stringValue forState:UIControlStateNormal];
        [self.view addSubview:item];

        //布局
        [item mas_makeConstraints:^(MASConstraintMaker *make) {

            //宽高是固定的,前面已经算好了
            make.width.mas_equalTo(itemWidth);
            make.height.mas_equalTo(height);

            //topTop距离顶部的距离,单行不用考虑太多,多行,还需要计算距离顶部的距离
            make.top.mas_offset(toTop+marginY);
            if (!last) {  //last为nil 说明是第一个按钮
                make.left.mas_offset(marginX);

            }else{
                //第二个或者后面的按钮 距离前一个按钮右边的距离都是gap个单位
                make.left.mas_equalTo(last.mas_right).mas_offset(gap);
            }
        }];
        last = item;
    }
}

-(void)layoutMultiLine{
    //多行布局 要考虑换行的问题

    CGFloat marginX = 10;  //按钮距离左边和右边的距离
    CGFloat marginY = 1;  //距离上下边缘距离
    CGFloat toTop = 200;  //按钮距离顶部的距离
    CGFloat gapX = 10;    //左右按钮之间的距离
    CGFloat gapY = 10;    //上下按钮之间的距离
    NSInteger col = 5;    //这里只布局5列
    NSInteger count = 13;  //这里先设置布局任意个按钮

    CGFloat viewWidth = self.view.bounds.size.width;  //视图的宽度
    CGFloat viewHeight = self.view.bounds.size.height;  //视图的高度

    CGFloat itemWidth = (viewWidth - marginX *2 - (col - 1)*gapX)/col*1.0f;  //根据列数 和 按钮之间的间距 这些参数基本可以确定要平铺的按钮的宽度
    CGFloat itemHeight = itemWidth;   //按钮的高度可以根据情况设定 这里设置为相等

    UIButton *last = nil;   //上一个按钮
    //准备工作完毕 既可以开始布局了
    for (int i = 0 ; i < count; i++) {
        UIButton *item = [self buttonCreat];
        [item setTitle:@(i).stringValue forState:UIControlStateNormal];
        [self.view addSubview:item];

        //布局
        [item mas_makeConstraints:^(MASConstraintMaker *make) {

            //宽高是固定的,前面已经算好了
            make.width.mas_equalTo(itemWidth);
            make.height.mas_equalTo(itemHeight);

            //topTop距离顶部的距离,单行不用考虑太多,多行,还需要计算距离顶部的距离
            //计算距离顶部的距离 --- 根据换行
            CGFloat top = toTop + marginY + (i/col)*(itemHeight+gapY);
            make.top.mas_offset(top);
            if (!last || (i%col) == 0) {  //last为nil  或者(i%col) == 0 说明换行了 每行的第一个确定它距离左边边缘的距离
                make.left.mas_offset(marginX);

            }else{
                //第二个或者后面的按钮 距离前一个按钮右边的距离都是gap个单位
                make.left.mas_equalTo(last.mas_right).mas_offset(gapX);
            }
        }];
        last = item;
    }
}

#pragma mark - Private
-(UIButton *)buttonCreat{
    UIButton *item = [[UIButton alloc] init];
    item.backgroundColor = [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0f];
    item.titleLabel.font = [UIFont systemFontOfSize:16];
    [item setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    return item;
}

@end

如上,代码中的注释已经很详细了,相信看到这里的同学都已经明白了布局原理,这里强调下最后总结的几句话:

分析了代码可以看出来 多行布局和单行布局其实没有什么特殊的地方

区别点 1.确定什么时候换行

2.确定距离布局区域顶部的距离多少

当前在真是开发环境中还会存在各种差异,但是只要理解了布局思路,相信不管怎么样布局都会游刃有余

由于代码只有一个文件,也已经全部贴出来了。这里就不提供demo了(-^^-)

版权归tinych,qqcc1388所有,转载请标注转载来源:http://www.cnblogs.com/tinych/p/8143836.html

原文地址:https://www.cnblogs.com/tinych/p/8143836.html

时间: 2024-11-09 00:30:32

iOS masonry九宫格 单行 多行布局的相关文章

iOS:Masonry介绍与使用

Masonry介绍与使用实践:快速上手Autolayout frame----->autoresing------->autoLayout-------->sizeClasses 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone

IOS Masonry的基本使用

Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS界面的库,可以代替Auto layout.Masonry的github地址:https://github.com/SnapKit/Masonry 本章内容 - Masonry配置 - Masonry使用 - Masonry实例 Masonry配置 - 推荐使用pods方式引入类库,pod 'Maso

iOS流布局UICollectionView系列六——将布局从平面应用到空间

iOS流布局UICollectionView系列六--将布局从平面应用到空间 一.引言 前面,我们将布局由线性的瀑布流布局扩展到了圆环布局,这使我们使用UICollectionView的布局思路大大迈进了一步,这次,我们玩的更加炫一些,想办法将布局应用的空间,你是否还记得,在管理布局的item的具体属性的类UICollectionViewLayoutAttributrs类中,有transform3D这个属性,通过这个属性的设置,我们真的可以在空间的坐标系中进行布局设计.iOS系统的控件中,也并非

iOS Masonry介绍与使用实践:快速上手Autolayout

如题,今天的任务是Nasonry介绍与使用实践:快速上手Autolayout & 自己App项目的适配 & 遇到的问题及解决方法. Tips: .h与.m文件之间的切换快捷键 control + command + 上下键 Tips:如何在Xib中设置Button的属性(圆角以及背景颜色).Inspector -- User Defined Runtime Attributes -- layer.cornerRadius & Number & 10 9月14号更新--好吧,

iOS开发 统计xcode代码行数

如果要统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" |xargs wc -l 列出每个文件的行数 find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or

iOS流布局UICollectionView系列五——圆环布局的实现

iOS流布局UICollectionView系列五--圆环布局的实现 一.引言 前边的几篇博客,我们了解了UICollectionView的基本用法以及一些扩展,在不定高的瀑布流布局中,我们发现,可以通过设置具体的布局属性类UICollectionViewLayoutAttributes来设置设置每个item的具体位置,我们可以再扩展一下,如果位置我们可以自由控制,那个布局我们也可以更加灵活,就比如创建一个如下的circleLayout: 这种布局方式在apple的官方文档中也有介绍,是UICo

ios开发之根据内容行数调整cell 高度,与label高度

设置cell高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NoticeMessage* msg = [arrayNoticeMessage objectAtIndex:indexPath.section];//取出对应的section或者cell UIFont *msgFont = [UIFont fontWithName:@"arial&qu

iOS UIlable根据内容多行显示

在storyboard的attributes inspector中设置: Lines: 设置为 "0" Line Breaks:设置为 "Word Wrap" 你应该需要将lable的高度约束也在代码中进行修改: CGSize sizeThatShouldFitTheContent = [self.nameLable sizeThatFits:self.nameLable.frame.size]; self.nameameLableHeightConstraint.

iOS开发tips-UITableView、UICollectionView行高/尺寸自适应

UITableView 我们都知道UITableView从iOS 8开始实现行高的自适应相对比较简单,首先必须设置estimatedRowHeight给出预估高度,设置rowHeight为UITableViewAutomaticDimension(注意:如果不修改rowHeight默认就是UITableViewAutomaticDimension),对于这两个参数除了直接修改tableview对应的属性之外仍然支持使用对应的代理方法设置.最后只要在UITableViewCell中设置conten