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/qqcc1388/p/8143836.html

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

  1. iOS Masonry控件等比例布局

    一.先解释相关API 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /**  *  distribute with fixed spacing  *  *  ...

  2. iOS masonry布局在iOS11/12上正常 iOS9/10却异常

    使用masonry布局,可以布局一套,适配所有机型,但是有时候会出现一些比较特殊的情况,每次iOS11上面开发,开发完成之后,在iOS9,iOS10上查看的时候发现布局与iOS11不完全一致,有的高度 ...

  3. iOS:Masonry介绍与使用

    Masonry介绍与使用实践:快速上手Autolayout   frame----->autoresing------->autoLayout-------->sizeClasses ...

  4. iOS开发 -------- 九宫格坐标计算

    一 要求 完成下面的布局 二 分析 寻找规律,每一个UIView的x坐标和y坐标 三 实现思路 (1) 明确每一块用得是什么View; (2) 明确每个View之间的父子关系,每个视图都只有一个父视图 ...

  5. * CSS 视觉格式化(基本框、包含块、盒模型、水平格式化、垂直格式化、行布局、em框、内容区、行间距、行内框、行框)

    前言 CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应该显示的 ...

  6. iOS仿支付宝首页的刷新布局效果

    代码地址如下:http://www.demodashi.com/demo/12753.html XYAlipayRefreshDemo 运行效果 动画效果分析 1.UI需要变动,向上滑动的时候,顶部部 ...

  7. CSS开发技巧(四):解决flex多行布局的行间距异常、子元素高度拉伸问题

    在使用flex布局时,若出现换行,有两种较为特殊的现象是值得我们研究的: 子元素高度被拉伸,其实际高度大于它的内容高度. 各行子元素之间的行间距过大,甚至我们根本没有给子元素设置margin. 现在我 ...

  8. css文字单行/多行超出显示省略号...

    css文字单行/多行超出显示省略号... 项目里写css样式我们经常会遇到将文字超出显示省略号的情况,记录一下以后能用到. 单行超出 .oneline { width:300upx; /*宽度一定要设 ...

  9. iOS masonry 不规则tagView布局 并自适应高度

    在搜索页面经常会有不规则的tag出现,这种tagView要有点击事件,单个tagView可以设置文字颜色,宽度不固定根据内容自适应,高度固定,数量不固定.总高度就不固定.最近对于masonry的使用又 ...

随机推荐

  1. 图片转换base64数据上传,并且实现预览的简便方法

    对于很多新手来说,实现上传图片并且预览功能,都会感到不知所可,然后开始在网站搜索各种各样的图片上传预览插件,但是有的时候我们只是想简单的实现判断格式,以及预览的功能,使用插件的话,会使得项目的资源空间 ...

  2. 深入理解Postgres中的cache

    众所周知,缓存是提高数据库性能的一个重要手段.本文着重讲一讲PostgreSQL中的缓存相关的东西.当然万变不离其宗,原理都是共同的,理解了这些,你也很容易把它运用到其它数据库中. What is a ...

  3. Hibernate级联之一对多和inverse解析

    hibernate的级联可以说是hibernate最重要的部分,只有深入了解了级联的特性与用法,才能运用自如. 这次讨论一对多的情况,所以就使用博客项目的用户表和博客表作为示例,来一起学习hibern ...

  4. JAVA基础1——字节&位运算

    占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...

  5. ABAP中的AMDP(ABAP-Managed Database Procedures )

    ABAP管理下的数据库存储过程(ABAP-Managed Database Procedure,以下简称AMDP)是在APAP on SAP HANA开发中的一种优化模式.AMDP使用数据库语言书写, ...

  6. 基于文本图形(ncurses)的文本搜索工具 ncgrep

    背景 作为一个VIM党,日常工作开发中,会经常利用grep进行关键词搜索,以快速定位到文件.如图: 利用grep进行文本搜索 但是,这一过程会有两个效率问题: 展示的结果无法进行直接交互,需要手动粘贴 ...

  7. Servlet交互【重定向 与 请求分派】详解

    Servlet交互 在serlvet中,需要调用另外一个资源来对浏览器的请求进行响应,两种方式实现: 调用HttpServletResponse.sendRedirect 方法实现 重定向 调用Req ...

  8. 微软为.NET程序员带来了最优的跨平台开发体验-WSL

    前言 在前几个Visual Studio Code更新中发现有一个重要得特性,就是nodejs可以使用VS Code在WSL中进行Debug了(WSL是指Win10中的Linux子系统),之前写过一篇 ...

  9. 简单了解enum

    enum的性质: 1.枚举类型的实例都是常量 2.要使用enum,需要创建一个该类型的引用,并将其赋值给某个实例 3.常用的方法:  *     toString():某个enum实例的名字  *   ...

  10. codeforces 893D Credit Card 贪心 思维

    codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...