使用Auto Layout实现和适配不等高复合型cell

现在实践中慢慢尽可能少的代码去实现UI部分,大都使用IB去操作,之前实现一些高度不统一cell,而且可能某些控件隐藏或者显示,都是拿到数据源通过代码去计算每行cell的高度,也比较耗费时间,接下来就聊聊我是怎么用Auto Layout去实现的。


cell.png


上面举个简单例子,cell内部只有两个控件,一个ImageView和Label,说下需求:

  • 假设UI给的效果图是6p的,图片在6p上是100*100的,在别的屏幕按比例缩放。
  • label的字数不固定。
  • label可能显示或隐藏,cell需要根据label的显示和隐藏去适应高度。

先来一步步来实现上面三个需求....

一、子控件根据父控件比例缩放

1、先在xib中拖出上面两个控件,选中图片,设置距离cell上面和左边的边距都为10,图片的x和y已经确定了,这里就不上图了,大家应该知道。
2、为了图片不变形,先设置图片相对自身的宽高比,选中图片,往自身拖出约束,选择Aspect Ratio


Snip20160131_16.png

Snip20160131_14.png


再选中刚刚添加的约束,在右边栏按图编辑好对应宽高比,这里设置宽高1:1。


Snip20160131_7.png


3、接下来是按屏幕宽度缩放,选中图片拖向它所在的父控件,这里的父控件就是contentView,同样选择Aspect Ratio。



选中约束还是在右边栏去编辑好,如下图,这里是相对6p的效果图,所以设置100:414,需求的第一步已经完成了。


Snip20160131_17.png
二、Label内容自适应

1、还是先设置Label上部距离图片底部边距以及距离父控件左、右侧边距,这三个约束已经给定label内容显示的最大宽度。
2、很重要的一步,选中label在上面栏点击Editor,选中Size to Fit Content,或者使用快捷键com = ,意味着label的尺寸根据它的内容去适应,根据你上一步给定的那个宽度去折行,同时记得label的行数设置为0。


Snip20160131_18.png


3、很显然现在运行cell的高度是不会根据内容适应高度的,再label添加一个下面距离父控件的约束,这里也是设为10的边距,现在
cell的高度 = 图片的上边距 + 图片高度 + 文字和图片边距 + 文字高度 + 文字下面距离父控件边距,是不是有些像我们平时使用Auto Layout设置scrollView的约束,你可以这么理解,父控件的内容根据子控件去撑满。


Snip20160131_19.png


最后还需要一行代码,也是最关键的一步,设置tableView的estimatedRowHeight,顾名思义就是预设的行高,你可以随意设置一个值,这样前两个需求就做完了,Auto Layout已经帮我们计算好了行高,是不是很方便才写了一行代码。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.example1TableView.estimatedRowHeight = 100;
}
三、设置约束优先级

先简单介绍一下约束优先级,具有优先级1000(UILayoutPriorityRequired)的约束为强制约束(Required Constraint),也就是必须要满足的约束;优先级小于1000的约束为可选约束(Optional Constraint)。默认创建的是强制约束。它分为
高优先级:UILayoutPriorityDefaultHigh,
低优先级:UILayoutPriorityDefaultLow,
内置的最低优先级:UILayoutPriorityFittingSizeLevel

typedef float UILayoutPriority;
static const UILayoutPriority UILayoutPriorityRequired NS_AVAILABLE_IOS(6_0) = 1000; // A required constraint.  Do not exceed this.
static const UILayoutPriority UILayoutPriorityDefaultHigh NS_AVAILABLE_IOS(6_0) = 750; // This is the priority level with which a button resists compressing its content.
static const UILayoutPriority UILayoutPriorityDefaultLow NS_AVAILABLE_IOS(6_0) = 250; // This is the priority level at which a button hugs its contents horizontally.
static const UILayoutPriority UILayoutPriorityFittingSizeLevel NS_AVAILABLE_IOS(6_0) = 50; // When you send -[UIView systemLayoutSizeFittingSize:], the size fitting most closely to the target size (the argument) is computed.  UILayoutPriorityFittingSizeLevel is the priority level with which the view wants to conform to the target size in that computation.  It's quite low.  It is generally not appropriate to make a constraint at exactly this priority.  You want to be higher or lower.

现在我们想当label隐藏时图片距离cell的底部也为10,现在就需要再添加一条图片距离cell底部为10的下边距,这时候我们发现会有冲突,选中这条约束把优先级设置得低一些,会发现冲突消失了,约束变成了虚线,把之前图片相对label的边距的约束拖到.h中作为cell的属性。


Snip20160131_20.png


在tableview代理方法里面判断label显示或隐藏来修改优先级

cell.imageBotton.priority = cell.label.hidden ? UILayoutPriorityDefaultLow : UILayoutPriorityDefaultHigh;

当label隐藏时把优先级设置为UILayoutPriorityDefaultLow,显示时设置UILayoutPriorityDefaultHigh,只要是比图片底部相对父控件边距那条约束低就行了。
这里有一个注意点:

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值