Masonry 与 frame 混用导致的问题
https://www.jianshu.com/p/357fab4b84e7
Masonry 与 frame 混用可能出现子控件大小跟预期不一致的情况,具体是什么样呢?
例如,自定义一个 UIView 的子类SmallView,SmallView 中含有一个 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,此时 SmallView的imageView 已经大小为0了
SmallView *small = [[SmallView alloc] init];
[self.view addSubview:small];
//约束和 frame 不一致,SmallView的imageView 已经大小为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 混用导致的问题的更多相关文章
- npm与cnpm混用导致的问题
npm和cnpm混用之后,再用npm升级模块导致如下错误: 解决办法: 删除node_modules文件下的文件后,重新执行npm install
- 静态链接和动态链接库混用导致的链接错误LINK2005
对于一个静态链接库L.lib,它的使用者app.exe会静态链接L.lib,意思是app.exe会将L.lib中的代码(app需要的部分,例如函数定义,类的定义等等)链接到app.exe中. 而对 ...
- titleView发生偏移、titleView与masonry、titleView的设置、titleView的使用
navigationItem的titleView属性的设置本身是很简单的,容易出问题的原因是自动化布局与frame混用造成的. 本文一步一步的讲解,力求找到问题的起源.如果你也在这块同样遇到问题,不妨 ...
- Selenium2学习-008-WebUI自动化实战实例-006-易迅登录之 frame 处理
此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,在因 frame 标签导致页面定位失败,提示 NoSuchElementException 时的,页面元素定位前的 fram ...
- 《从陷阱中学习C/C++》读书笔记
1.运算符优先级很容易引起问题,如a = 4<<1+1,由于<<的优先级低于+,故其执行过程为 a = 4<<(1+1); 常见的运算符优先关系:(具体参照博客) ...
- 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 ...
- C/C++走过的坑(基础问题篇)
1.有符号int与无符号int比较 #define TOTOL_ELEMENTS (sizeof(a) / sizeof(a[0]) ); int main() { int a[] = {23,24, ...
- 201521123076 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 创建线程方式: 定义Thread的子类,覆盖run(),之后创建实例.因为开销大,一般不用. 定义实现Run ...
- 201521123030 《Java程序设计》 第10周学习总结
1. 本周学习总结 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 在fi ...
随机推荐
- javascript基础修炼(1)——一道十面埋伏的原型链面试题
在基础面前,一切技巧都是浮云. 题目是这样的 要求写出控制台的输出. function Parent() { this.a = 1; this.b = [1, 2, this.a]; this.c = ...
- [ASP.NET] ASP.NET Identity 中 ClaimsIdentity 解析
各位好 : ) 最近筆者在嘗試改用ASP.NET Identity做為新系統的認證方式,發現到網路上給的資訊,不是很完整,所以做為一個工程屍,為了避免大家遇到一樣的問題.特地將一些有趣的地方記錄下來 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一)
环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输: xftp 1.在本地创建asp.net core应用发布 1.1 使用Vs2017 新建 ...
- WPF 客户端浏览器 添加Loading加载进度
在windows开发界面时,使用浏览器来请求和显示网页内容,是比较常见的. 但是在请求网页内容时,因网速或者前端功能复杂加载较慢,亦或者加载时遇到各种问题,如空白/黑屏/加载不完整/证书问题等. 因此 ...
- JQuery官方学习资料(译):Data方法
你可能经常会想需要通过元素来存储一些数据.在JavaScript中你可能需要给元素添加属性来实现这样的功能,但是在某些浏览器中,你可能还需要处理因此造成的内存泄露问题.JQuery提供了一个简 ...
- sql 参数化查询问题
一.正确案例 string name=“梅”; string sql="select * from test where Name like @Name"; //包含 梅Sql ...
- v8 GC机制
1.为什么要分代 V8是Chrome浏览器的javascript解释器,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那 ...
- Java自学总结--简介
学习Java一年多了,练习了很多,这条路真的很难走.还有半年多毕业的我整理整理所学习的笔记给大家分享主要也是让自己记忆加深.自学时用到的时阿发老师的教学视频,通俗易懂还有题库可以练习.最经典的就是阿发 ...
- 纯css做幻灯片效果
css3里面有一个@keyframes动画功能. w3c上面的例子: 可以使用它来做一个幻灯片效果. <!DOCTYPE html> <html lang="en" ...
- XSS 漏洞介绍
概念: XSS 攻击:跨站脚本攻击 (Cross Site Scripting),为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆.故将跨站脚本攻击缩写为 XS ...