几张图弄明白ios布局中的尺寸问题
背景
先说说逆向那事。各种曲折..各种技术过时,老老实实在啃看雪的帖子..更新会有的。
回正题,这里讨论的是在Masnory框架下的布局问题。像我这种游击队没师傅带,什么都得自己琢磨,一直没闹明白下面几个问题,今天终于下决心整理测试了一下,看完这篇文章基本上能闹明白ios的图标大小问题了。
会讨论问题
如果还没有概念,请网上搜搜背景技术点,这里只穿针引线插上几句,基本概念还这里不会再复制粘贴一遍。
集中想讨论3个问题,其他问题再这3个问题的答案基础上很好延伸弄明白。
Q:@1x,@2x,@3x的图片什么时候会用上? Q:怎么保证不同机型的图标显示尺寸一致? Q:masnory下的mas_equalTo、mas_greaterThanOrEqualTo、mas_lessThanOrEqualTo到底有什么区别?
为验证问题,准备了3个logo,@1x、@2x、@3x的分辨率分别设定为38、75、180,都是用之前写的icon工具一键导出的,为了做区分,在logo中写了1、2、3加以区分。测试在模拟器下进行。

Q:@1x,@2x,@3x的图片什么时候会用上?
简单理解,是根据机型来的。深入点说,根据屏幕尺寸来的。这里需要了解的知识点有俩
1.尺寸的单位,CGSizeMake(33,33)
函数中尺寸单位不是px也不是android中dp,具体请搜索。一句话理解就是:根据屏幕分辨率不同,单位实际代表的px大小公式不同,可简单理解为一个相对尺寸,@nx表示@1x的像素尺寸乘以多少倍。


图中左边是iphone6(@2x),右边是iphone6 plus(@3x)。代码固定了大小为66*66。可以大致看出来图标大小其实是不一样的(为什么后面会提到)。
[self.image mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.mas_equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(,));
}];
需要注意的是,你的图片实际像素尺寸不能比代码给定的尺寸小,否则图片会失真很难看。比如现在代码是66*66,那么@2x的像素大小不能低于132*132,@3x的不能低于198*198,明白了吧?
2.关键的44*44
这是ios认为人的手指点按钮最小的尺寸大小。苹果在ui规范中给定了很多元素的标准尺寸,照着要求出图就行。但如果是自定义的尺寸,比如你想画一个超大的圆在界面上,那就得把1x、2x、3x的图标都做好,尺寸大小应参照(1)的公式。比如你想在ui中展示一个40*40的图标,那么,@1x的实际px像素为40*40,@2x的实际像素尺寸为80*80,@3x的实际像素尺寸为120*120。
Q:怎么保证不同机型图标尺寸一致?
如果想不同机型下显示的尺寸一模一样,可以用百分比的方式define一个值,这样不同的机型,图标尺寸一模一样肯定没得跑。
#define kCaptureBtnSize CGSizeMake(kWindowW/3.5f,kWindowW/3.5f) //按钮尺寸
如果不想用百分比,想直接设定,那怎么控制不同屏幕下的尺寸大小?如果是mas_equalTo属性,会自动根据屏幕分辨率设定,图标显示大小其实不一样的(如果你设定过边距就更能感受的到),需要用到、mas_greaterThanOrEqualTo、mas_lessThanOrEqualTo这几个属性了。
Q:masnory下的mas_equalTo、mas_greaterThanOrEqualTo、mas_lessThanOrEqualTo到底有什么区别?
mas_equalTo已经前面讲了,并且也是最常用的关系。greater和less如字面意思一样“比尺寸大”/“比尺寸小”,那么这里究竟比谁大呢?这里指的其实是图标的实际像素尺寸,看图:

这里设定了一个比图标实际尺寸大的值100*100(根据公式,在iphone6 plus下,图标尺寸应该为300*300),如果mas_lessThanOrEqualTo,那么由于像素尺寸不足,所以图标是多大,就显示多大。

这里设定了一个比图标实际尺寸小的值50*50(根据公式,在iphone6 plus下,图标尺寸应该为150*150),如果mas_greaterThanOrEqualTo,那么由于像素尺寸超过了设定尺寸,所以图标是多大,就显示多大。
总结
现在能明白布局中的尺寸问题了吧。只要图标的实际像素尺寸按照公式计算得出,那么就不会出现像素失真的问题,也可以保证不同屏幕下的尺寸。
P.S
来App独立开发群533838427
github:https://github.com/huijimuhe
几张图弄明白ios布局中的尺寸问题的更多相关文章
- 一张图弄明白开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的区别
导读 在开源软件中经常看到各种协议说明,GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么区别 - 如何选择合适的开源协议 请看下文,特作记录一篇,以供后续查看 ...
- 一张图弄懂js原型和原型链
前言 JavaScript的原型和原型链是面试的时候经常被问及到的问题,考察了我们对JavaScript的基础掌握情况,今天我们在这里用一张图来梳理下其中的知识点. 下面我来引入这张非常经典的图,我也 ...
- 一张图记住TCP/IP通讯中的IP地址配置
TCP/IP通讯情景: 用网线将计算机A(服务器Server)和计算机B(Client)连接起来.程序代码在计算机A中,计算机B中安装有TCP/IP通讯助手. (图中屏幕大的是计算机A,屏幕小的笔记本 ...
- 几张图解释明白 Kubernetes Ingress
来源:K8s技术圈 作者:阳明 Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到 ...
- 几张图看明白VAO、VBO、EBO的关系和代码顺序
0.详细教程可看https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/ 1.可以简单地认为VAO的 ...
- 一张图弄明确开源协议-GPL、BSD、MIT、Mozilla、Apache和LGPL 之间的差别
导读 在开源软件中常常看到各种协议说明.GPL.BSD.MIT.Mozilla.Apache和LGPL. - 这些协议之间的有什么差别 - 怎样选择合适的开源协议 请看下文,特作记录一篇,以供兴许查看 ...
- 一张图弄懂opengl的诸多库gl glu glut freeglut glew glfw之间关系
开始学习opengl,但是看opengl编程指南不同版本之间使用了一堆不同的库,概念名称全都搅起的,越看越糊涂,遂整理的一下opengl相关的一些库的名词, 才发现是不同时期不同版本不断发展的结果. ...
- 两张图弄懂函数的递归(以golang为例)
函数递归时要遵守的原则: 执行一个函数时,就要创建一个新的受保护的独立空间(新函数栈) 函数的局部变量是独立的,不会相互影响: 递归必须向退出递归的条件逼近,否则就会无限递归: 当一个函数执行完毕,或 ...
- IOS自己主动布局中的浮动布局(6)----MyFloatLayout横空出世
https://github.com/youngsoft/MyLinearLayout 前言 在MyLayout的6大布局中,每种布局都有不同的应用场景. 且每种布局的子视图的约束机制不一样:线性布局 ...
随机推荐
- FATAL ERROR: Could not find ./bin/my_print_defaults的解决办法
对mysql数据库初始化过程中,会有如下报错信息: 1 2 3 4 5 6 7 [root@localhost scripts]# ./mysql_install_db --user=mysql FA ...
- 今天说一下 Group by 这个东西
group by 这个关键字,这个语句太平凡了~基本上只要有报表的地方,就会有它的身影. 常规用法就是 INSERT INTO #TypeValue ( TypeID, Col2 ) , N , N ...
- W3School-CSS 边框(border)实例
CSS 边框(border)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边 ...
- Linux文件和目录
access() //检查是否调用进程有Access这个文件的权限,如果文件是一个符号链接,会将它解引用,成功返回0,失败返回-1设errno #include <unistd.h> in ...
- ORA-00020: No more process state objects available故障一例
今天公司一大早收到通知,昨天数据库数据未生成.当时查看跑批的日志,发现平常只需运行半个小时的过程,今天整整运行了7个小时(明显存在问题),导致后续数据正常时间读取失败.为了了解起因,查看了oracle ...
- 再不写,我怕就再也不写了-LAMP基础
hi 经历了4天大餐的洗礼,整个人都思密达了...昨天的懒,是没有原因的懒,总之就是该提笔了亲 1.Ubuntu下的LAMP配置 -----Ubuntu基础知识----- ----管理员权限 出于安全 ...
- MMORGP大型游戏设计与开发(客户端架构 part1 of vgui)
作为客户端的重要装饰,UI扮演着极为重要的角色,是客户端中核心的组成.vgui(微GUI)中,提供了核心的接口封装,实现了客户端中常见的界面操作,并结合lua脚本,使得控制界面更加的方便. 构架 总结 ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 《Invert》开发日志01:核心玩法设计
前面提过,这个游戏的核心玩法基于我做的第一个Unity游戏,名字就叫<Invert>,现在在应用宝上面还能搜到.不过那个游戏也不是我原创的,它的玩法设计来自github上的一个开源项目(h ...
- C# 匿名函数 详解
匿名函数的定义和用途 匿名函数是一个“内联”语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型,传递一个方法块,而 ...