说起tableView的自动计算行高,真的是不想再提了,写了不知道几百遍了。可就是这麽一个小玩意儿,把我给难的不行不行的,眼看都要没头发了。

1、设置tableView的预估行高和行高为自动计算

 // 设置预估行高
self.tableView.estimatedRowHeight = ;
// 设置行高自动计算
self.tableView.rowHeight = UITableViewAutomaticDimension;

2、设置cell的contentView的底部约束和最下面一个控件的底部约束对齐

 - (void)setupUI{
UIImageView *imgV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];
UILabel *rightLabel = [[UILabel alloc] init];
UILabel *bottomLabel = [[UILabel alloc] init]; [self.contentView addSubview:imgV];
[self.contentView addSubview:rightLabel];
[self.contentView addSubview:bottomLabel];
_imgV = imgV;
_rightLabel = rightLabel;
_bottomLabel = bottomLabel; imgV.contentMode = UIViewContentModeScaleAspectFit;
rightLabel.text = @"我是图片右边的Label";
bottomLabel.text = @"我是图片下边的Label"; [imgV mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self.contentView).offset();
make.size.mas_equalTo(CGSizeMake(, ));
}];
[rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imgV);
make.left.equalTo(imgV.mas_right).offset();
}];
[bottomLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imgV.mas_bottom).offset();
make.left.equalTo(imgV).offset();
make.height.mas_equalTo();
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.mas_equalTo(self);
// contentView的底部和最下面控件底部对齐
make.bottom.equalTo(bottomLabel);
}];
}

3、看、看、看,错误来了:

请看重点部分,contentView的高度居然为0,这是什么个情况,写了几百遍的代码怎么会报错呢,真是百思不得其姐。

研究了大半天,终于发现了,是Xcode8.0+和iOS10+的问题。

要修改为:最下面一个控件的底部和contentView的底部对齐,然后把contentView的4条边和self对齐。

    [bottomLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imgV.mas_bottom).offset();
make.left.equalTo(imgV).offset();
make.height.mas_equalTo();
// 重点代码:最下面控件底部和contentView的底部对齐
make.bottom.equalTo(self.contentView);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
// 重点代码:contentView的4条边和self对齐
make.top.left.right.bottom.mas_equalTo(self);
}];

这就好了嘛,同学,你想多了,运行结果如下:

这是为嘛,contentView的高度有了,控件的高度怎么又冲突了呢,我也想知道。只是,我不知道原因,只知道怎么解决,有知道原因的小伙伴可以发表下评论,分享一下。

这里我需要引用NB_Token的一段话,是这位兄台,给我解决了问题。

出处:http://blog.csdn.net/nb_token/article/details/53305414

Masonry可以设置约束的优先级,优先级分为priorityHigh,priorityMedium,priorityLow(高,中等,低)三个等级。优先级默认为中等,所以当我们对某一个控件的约束条件重复后,会打印警告信息,告诉我们应该去修复它们。

既然知道了警告的产生原因,那么解决办法有两种:
.找到该控件,修改它的相关约束,以消除警告信息。
.将控件的约束优先级置为高级,那么就算约束重复了也不会有警告。这也是最简单省事的办法。

在cell里,只要设置控件的高度(包括通过size)设置,就会冲突,我们需要提高约束的优先级。

下面我们上下终极代码:

 - (void)setupUI{
UIImageView *imgV = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];
UILabel *rightLabel = [[UILabel alloc] init];
UILabel *bottomLabel = [[UILabel alloc] init]; [self.contentView addSubview:imgV];
[self.contentView addSubview:rightLabel];
[self.contentView addSubview:bottomLabel];
_imgV = imgV;
_rightLabel = rightLabel;
_bottomLabel = bottomLabel; imgV.contentMode = UIViewContentModeScaleAspectFit;
rightLabel.text = @"我是图片右边的Label";
bottomLabel.text = @"我是图片下边的Label"; [imgV mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self.contentView).offset();
// 重点代码:提高约束的优先级
make.size.mas_equalTo(CGSizeMake(, )).priorityHigh();
}];
[rightLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imgV);
make.left.equalTo(imgV.mas_right).offset();
}];
[bottomLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(imgV.mas_bottom).offset();
make.left.equalTo(imgV).offset();
make.height.mas_equalTo();
// 重点代码:设置底部控件的底部约束和contentView的底部对齐
make.bottom.equalTo(self.contentView);
}];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
// 重点代码:contentView的4条边和self对齐
make.top.left.right.bottom.mas_equalTo(self);
}];
}

分享下效果图:

希望通过这篇文章解决问题的小伙伴儿们给个赞^_^

Xcode8+和iOS10+使用Masonry自动计算行高的更多相关文章

  1. ios label 自动计算行高详解

    在OC当中自动计算行高主要调用系统的 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #ffffff } span ...

  2. FireMonkey ListView 自动计算行高

    说明:展示 ListView 视其每一行 Item 的 Detail 字串长度自动调整高度(可每行高度不同). 适用:Delphi XE7 / XE8 源码下载:[原创]ListView_自动计算行高 ...

  3. 【转】FireMonkey ListView 自动计算行高

    说明:展示 ListView 视其每一行 Item 的 Detail 字串长度自动调整高度(可每行高度不同). 适用:Delphi XE7 / XE8 源码下载:[原创]ListView_自动计算行高 ...

  4. iOS开发——UI进阶篇(三)自定义不等高cell,如何拿到cell的行高,自动计算cell高度,(有配图,无配图)微博案例

    一.纯代码自定义不等高cell 废话不多说,直接来看下面这个例子先来看下微博的最终效果 首先创建一个继承UITableViewController的控制器@interface ViewControll ...

  5. iOS UITableView 解决估算行高和指定行高的矛盾

    喜欢交朋友的加:微信号 dwjluck2013 1.一般来说 在iOS 中若UITableViewCell 固定行高, 会通过 - (CGFloat)tableView:(UITableView *) ...

  6. wpf datagrid row height 行高自动计算使每行行高自适应文本

    wpf 的datagrid的行高 要么是Auto,要么是定值:但会带来麻烦就是每行行高都一样. 当需要按内容(主要是wrap 换行的textbox或textblock)来动态调整行高的时候,需要用到d ...

  7. 关于Xcode8.1 / iOS10+ 真机测试系统打印或者宏定义打印不显示问题

    前言: 最近做项目时遇到了很多莫名其妙的问题,其中就有这个打印(NSLog).也不多废话了,我们先来回顾一下Xcode8发布以来,我们遇到的一些关于打印的问题,当然也有解决方法: 1.Xcode8打印 ...

  8. Xcode8 及iOS10适配问题汇总

    上点干货,目前得知的一些bug解决汇总:iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp:// ...

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

    UITableView 我们都知道UITableView从iOS 8开始实现行高的自适应相对比较简单,首先必须设置estimatedRowHeight给出预估高度,设置rowHeight为UITabl ...

随机推荐

  1. 在Redhat上为.Net 项目构建基于Jenkins + Github + Mono 的持续集成环境

    在Redhat enterprise 6.5 的服务器上,为在gutub 上的 .net 项目构建一个持续集成环境,用到了Jenkins和mono.因公司的服务器在内网,访问外网时要通过代理,所以在很 ...

  2. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

  3. 构建Web API服务

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 构建动态Web API控制器 ABP可以自动地为应用层生成Web API 层.比如说我们之前创建的应用层: namespace N ...

  4. Entity Framework 6 Recipes 2nd Edition(10-1)译->非Code Frist方式返回一个实体集合

    存储过程 存储过程一直存在于任何一种关系型数据库中,如微软的SQL Server.存储过程是包含在数据库中的一些代码,通常为数据执行一些操作,它能为数据密集型计算提高性能,也能执行一些为业务逻辑. 当 ...

  5. iOS开发中静态库之".framework静态库"的制作及使用篇

    iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析

    系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...

  7. u-boot源码分析之C语言段

    题外话: 最近一直在学习u-boot的源代码,从代码量到代码风格,都让我认识到什么才是真正的程序.以往我所学到的C语言知识和u-boot的源代码相比,实在不值一提.说到底,机器都是0和1控制的.感觉这 ...

  8. Spark的DataFrame的窗口函数使用

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 SparkSQL这块儿从1.4开始支持了很多的窗口分析函数,像row_number这些,平时写程 ...

  9. 【Spring-web】RestTemplate源码学习——梳理内部实现过程

    2016-12-28 by 安静的下雪天  http://www.cnblogs.com/quiet-snowy-day/p/6228198.html  提示:使用手机浏览时请注意,图多费流量. 本篇 ...

  10. 深入学习jQuery描述文本内容的3个方法

    × 目录 [1]html() [2]text() [3]val()[4]总结 前面的话 在javascript中,描述元素内容有5个属性,分别是innerHTML.outerHTML.innerTex ...