https://www.jianshu.com/p/357fab4b84e7

Masonry frame 混用可能出现子控件大小跟预期不一致的情况,具体是什么样呢?

例如,自定义一个 UIView 的子类SmallViewSmallView 中含有一个 UIImageView,在控制器创建SmallView,在SmallView创建UIImageView时都使用 init 方法,都没有给定 frame,但是在使用 masonry 约束时,用到了 frame,那么这就很可能会出现问题,导致大小跟预期不一致。

.

SmallView 中创建 UIImageView

_imageView = [[UIImageView alloc] init];

_imageView.image = [UIImage imageNamed:@"一无所有"];

[self addSubview:_imageView];

//1.

//这种写法容易出问题,如果 SmallView 创建时没有设置 frame 或者重新约束,那么_imageView并不能达到预期的效果

//SmallView init 会先执行这里,然后在约束SmallView,但是 imageview 的大小已经在这里定型了

[_imageView mas_makeConstraints:^(MASConstraintMaker *make) {

    //问题就在self.bounds.size.width,self.bounds.size.height,如果外面创建SmallView,没有 frame, 这里就是0

    make.size.mas_equalTo(CGSizeMake(self.bounds.size.width, self.bounds.size.height));

    make.center.mas_equalTo(self);

}];

在控制器中创建 SmallView

//1.没有给定 frame,此时 SmallViewimageView 已经大小为0

SmallView *small = [[SmallView alloc] init];

[self.view addSubview:small];

//约束和 frame 不一致,SmallViewimageView 已经大小为0,只对SmallView起效果了

[small mas_makeConstraints:^(MASConstraintMaker *make) {

    

    make.size.mas_equalTo(CGSizeMake(100, 100));

    make.top.mas_equalTo(self.view).mas_offset(30);

    make.leading.mas_equalTo(self.view).mas_offset(30);

}];

结果是这样,没有大小,不是与 SmallView 一样大

imageView 大小为0.png

那就给一个 frame

SmallView *small = [[SmallView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

图片大小为 init 时的50,50

image 并没有跟 SmallView 一样大.png

那么正确的姿势来了。

.

SmallView 中创建 UIImageView

//2.

//这种写法无论 SmallView在创建时有没有给定 frame 或者给了 frame 但是约束跟 frame 不一致也不会出问题.

[_imageView mas_makeConstraints:^(MASConstraintMaker *make) {

    

    //这里是约束,并不是 frame

    //make.size.mas_equalTo(self);

    make.width.mas_equalTo(self.mas_width);

    make.height.mas_equalTo(self.mas_height);

    make.center.mas_equalTo(self);

}];

在控制器中创建 SmallView

//2.frame 和约束不一致,使用的是约束,无所谓啦

//SmallView *small = [[SmallView alloc] init];

SmallView *small = [[SmallView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

[self.view addSubview:small];

//约束和 frame 不一致,使用的是约束,无所谓啦

[small mas_makeConstraints:^(MASConstraintMaker *make) {

    

    make.size.mas_equalTo(CGSizeMake(100, 100));

    make.top.mas_equalTo(self.view).mas_offset(30);

    make.leading.mas_equalTo(self.view).mas_offset(30);

}];

不怕不怕啦.png

那么,结论就是在自定义控件时,内部约束尽量使用mas_width这种属性,谨慎使用具体数值,如固定的 width 等等。如果你使用了 UIView 的快速改变 frame 的分类一定要注意,很多属性名类似,如 centerX mas_centerX可是不一样的,后果你遇到就知道啦~

代码https://github.com/lxszl/UIViewTest

作者:loyt

链接:https://www.jianshu.com/p/357fab4b84e7

来源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Masonry 与 frame 混用导致的问题的更多相关文章

  1. npm与cnpm混用导致的问题

    npm和cnpm混用之后,再用npm升级模块导致如下错误: 解决办法: 删除node_modules文件下的文件后,重新执行npm install

  2. 静态链接和动态链接库混用导致的链接错误LINK2005

    对于一个静态链接库L.lib,它的使用者app.exe会静态链接L.lib,意思是app.exe会将L.lib中的代码(app需要的部分,例如函数定义,类的定义等等)链接到app.exe中.   而对 ...

  3. titleView发生偏移、titleView与masonry、titleView的设置、titleView的使用

    navigationItem的titleView属性的设置本身是很简单的,容易出问题的原因是自动化布局与frame混用造成的. 本文一步一步的讲解,力求找到问题的起源.如果你也在这块同样遇到问题,不妨 ...

  4. Selenium2学习-008-WebUI自动化实战实例-006-易迅登录之 frame 处理

    此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,在因 frame 标签导致页面定位失败,提示 NoSuchElementException 时的,页面元素定位前的 fram ...

  5. 《从陷阱中学习C/C++》读书笔记

    1.运算符优先级很容易引起问题,如a = 4<<1+1,由于<<的优先级低于+,故其执行过程为 a = 4<<(1+1); 常见的运算符优先关系:(具体参照博客) ...

  6. Requests库上传文件时UnicodeDecodeError: 'ascii' codec can't decode byte错误解析

    在使用Request上传文件的时候碰到如下错误提示: 2013-12-20 20:51:09,235 __main__ ERROR 'ascii' codec can't decode byte 0x ...

  7. C/C++走过的坑(基础问题篇)

    1.有符号int与无符号int比较 #define TOTOL_ELEMENTS (sizeof(a) / sizeof(a[0]) ); int main() { int a[] = {23,24, ...

  8. 201521123076 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 创建线程方式: 定义Thread的子类,覆盖run(),之后创建实例.因为开销大,一般不用. 定义实现Run ...

  9. 201521123030 《Java程序设计》 第10周学习总结

    1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 在fi ...

随机推荐

  1. webpack4.0各个击破(5)—— Module篇

    webpack4.0各个击破(5)-- Module篇 webpack作为前端最火的构建工具,是前端自动化工具链最重要的部分,使用门槛较高.本系列是笔者自己的学习记录,比较基础,希望通过问题 + 解决 ...

  2. Android开发——Notification通知的各种Style详解

    本来是想与之前讲解使用Notification通知使用一起写的,查看了资料,觉得有必要将这Style部分单独拿出来讲解 前篇:Android开发——Notification通知的使用及Notifica ...

  3. 5-Redis 的持久化之 RDB

    2016-12-22 13:58:48 该系列文章链接NoSQL 数据库简介Redis的安装及及一些杂项基础知识Redis 的常用五大数据类型(key,string,hash,list,set,zse ...

  4. html/css的学习之路(1)

    HTML5简介:HTML5是什么?要回答这个问题,我们需要先了解一下HTML是什么.HTML的英文全称为Hyper Text Markup Language,即超文本标记语言.HTML5是HTML的一 ...

  5. js 数组随机洗牌

    //先定义一个某数值范围内的随机数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1) + ...

  6. 怎么使用Fiddler进行抓包

    启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框.      在Fiddler Options”对话框切换到“Co ...

  7. Python 使用Python远程连接并操作InfluxDB数据库

    使用Python远程连接并操作InfluxDB数据库 by:授客 QQ:1033553122 实践环境 Python 3.4.0 CentOS 6 64位(内核版本2.6.32-642.el6.x86 ...

  8. 对国内AR产业的预言

    先丢预言,国内任何AR公司,包含几大块,医疗行业.手机制造商和自动驾驶,倘若没有能力进行系统设计,最后都要死,或者裁掉业务. AR本身不会演化为独立的业务,而是作为辅助性的工具进入传统已经存在的部门之 ...

  9. grid++报表使用时注意事项

    #开始使用:Grid++Report 可以在 Visual C#.Net 与 Visual Basic.Net 下的 WinForm 项目中使用.在项目中使用 Grid++Report 之前,首先必须 ...

  10. 【已解决】报异常:java.lang.ArithmeticException: / by zero

    异常名称如下:java.lang.ArithmeticException: / by zero 原因:当我们定义的被除数为整形时候(short  int  long)会抛出此异常,被除数为整形时不可以 ...