热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

结合AutoLayout实践iOS8上UITableViewCell高度的自适应

上一次写博客已经是4个月之前了,不是不想写,只是没找到太合适的题目,本人秉着宁缺毋滥的原则好吧,我承认是我懒惰了;四个月,虽然陆续提交了几个项目,但是所学所用变化不大;与

上一次写博客已经是4个月之前了,不是不想写,只是没找到太合适的题目,本人秉着宁缺毋滥的原则......

好吧,我承认是我懒惰了;

四个月,虽然陆续提交了几个项目,但是所学所用变化不大;与此同时,随着公司人事比较大的动,我也重新找到了自己的位置,希望自己能百尺竿头,更进一步^_^

今天想写的,题目已经表示出来了,灵感的来源是“iOS进阶指南试读之UI篇”这篇文章,正好下午没事就实践了一下,下面就把实践的一些东西记录一下;

autolayout

最早还是自己手动写cell的时候,还是通过计算frame的方式进行UI布局,记得是iOS8出来的时候吧,正好二期项目开始,就和当时的同事一起学习了如何使用autolayout进行UI布局,因为要进行6s和6plus的适配,一开始确实有些怪,但后来慢慢也就习惯了,觉得很好用,但是对于cell的高度还是要算(其实可以自适应,后边会讲到),限于对autolayout的理解程度,一篇UI上的约束我自己看着都乱;

1. Intrinsic Content Size(借用一下标题^_^)

先举个例子吧,之前对这样一个界面

之前的方式:

我会分别对三个label(1、2、3)进行 距上-距左-距右,以及高度的约束设置(注意label3没有距下的约束);然后在Controller中根据拿到的数据源进行文本显示区域高度的计算以契合该cell,最后的cell高度由其内部各视图的高度计算得出,通过tableVIew的代理再设置一下;

是不是忍不了,我也忍不了,但是没办法啊>_<,不过没关系,当你读完这篇文章的时候,也许就不用在这样做了;

autolayout:

所谓autolayout,其实就是系统通过我们所设置的约束,对UI上的相关控件进行自动布局,那么约束就显得至关重要了;

上图所示的红色View,并在上面依次放了3个label,以label1为例,若按之前的方式,距上-距左-距右,以及高度的约束设置,就可以确定这个视图的位置固定;

如果是UIView的话,只有距上-距左-距右,那么Xcode就会提示需要进行高度的设置,因为如果不进行高度的设置,这个视图的位置是无法确定的:

autolayout的本质就是系统通过你设置的约束帮你计算一个控件的位置和大小;

但如果是UILabel的话,只有距上-距左-距右,那么Xcode则不会提示,即不需要进行高度约束的设置:

之所以有这种情况,是因为有些视图可以通过自己的额内容计算高度,而有些视图则不可以;对应所要讲的就是我们的小标题 Intrinsic Content Size(固有内容大小);

对应的系统方法是 -(CGSize)intrinsicContentSize;

UIView&UILabel:

一个UIlabel肯定具备四个条件:内容、字体、行数、换行模式;即只要赋予了label内容,label的大小也就确定了,也因此,我们不需要特意指定一个UILabel的宽高(特殊要求除外);

UIView不可以自己计算大小,则是因为他没有内容;

Intrinsic Size-Placeholder:

那如果我们不想用label自己计算的高度,或是UIView的高度我们也不想通过添加约束的方式来设置,利用Intrinsic Size的Placeholder,我们是可以做到的;

我们先看一个例子:基于上图,我们把label的高度拉大一点,Xcode会给出一个警告,意思是 真实的高度是44,但自己计算的却不是这个值,如下图;


在右侧面板显示约束的下边,存在Intrinsic Size的属性设置:

我们看到默认使用系统定义的,对应的也就是现在警告的情况;

我们在xib中将Intrinsic Size属性设置为Placeholder,这样就不会报错了(如下图):


这个属性的作用就是给相应视图提供一个默认的大小;

如果是代码实现的可以在UILabel的子类中,重写 -(CGSize)intrinsicContentSize;方法,如:

- (CGSize)intrinsicContentSize
{
CGSize originalSize = [super intrinsicContentSize];

CGSize size = CGSizeMake(originalSize.width+20, originalSize.height+20);

return size;
}
表示:先获取系统通过label内容计算出来的大小,再分别增大返回新的Size即可;

2.Content Hugging Priority & Content Compression Resistance Priority:

这两个概念需要结合我们上面讲的Intrinsic Content Size来理解,每一个控件都有一个系统计算的最佳大小:
Content Hugging Priority这个属性就代表着,一个控件拒绝本身size大于InstrinsicSize的优先级;
Content Compression Resistance,这个属性代表着,一个控件拒绝本身size小于InstrinsicSize的优先级;

优先级越高,拒绝的程度就越大,也就是最后才会被拉伸或压缩;


我们举一个例子:

1.新建一个cell,UI同这篇blog的第一张图;

2.label的约束均为:距上 距下 距左 距右(不设宽高,自动计算);

3.然后我们改变cell的宽高;

如果3个label的拉伸或压缩优先级的相同(上图中的251 750)是不被允许的,因为随着cell的宽高变化,label面临一个问题,在保持和父View间距不变的情况下,必须有一个label做出妥协,即进行宽高的变化,否则Xcode是不知道到底该拉伸哪个Label的;

那到底那个先做出妥协,这就是这两个属性的作用;


我们对label1-label2-label3做出以下优先级调整:

即随着cell的变化,3个label是有一个变化顺序的,看看下面的图示,是不是和我们预想的一样:

结合AutoLayout实践iOS8上UITableViewCell高度的自适应:

在做这个Demo时,我忽然想起,许久之前看到的关于iOS8上,cell高度自适应的属性设置,那时还不甚理解,现在看来其实原理就是基于有些控件的高度自动计算反推cell的高度,那时系统也还需要满足iOS7,也就搁置了,现在的项目是基于iOS8的,接下来就让我们来操作一下:

1.新建一个cell,UI同这篇blog的第一张图;

2.label的约束均为:距上 距下 距左 距右(不设宽高,自动计算);

3.红色View的约束为:距上 距下 距左 距右;

tableView设置rowHeight为UITableViewAutomaticDimension,表示自动计算cell尺寸:

   self.tableView.estimatedRowHeight = 50.0f;
self.tableView.rowHeight = UITableViewAutomaticDimension;
我们再将数据源设置为不同长度的文本:

    
[self.tableArray addObjectsFromArray:@[@{@"label1":@"auwefhauwehf",
@"label2":@"auwefhauwehf",
@"label3":@"auwefhauwehf"},
@{@"label1":@"auwefhauwehfauwefhauwehf",
@"label2":@"auwefhauwehfauwefhauwehf",
@"label3":@"auwefhauwehfauwefhauwehf"},
@{@"label1":@"auwefhauwehfauwefhauwehfauwefhauwehf",
@"label2":@"auwefhauwehfauwefhauwehfauwefhauwehf",
@"label3":@"auwefhauwehfauwefhauwehfauwefhauwehf"}]];

最后把heightForRowAtIndexPath的代理方法注释掉;

运行代码,结果如下:

我们看到:

虽然我们设置的预计的RowHeight是50,但是实际显示出来的cell确实根据各个label自己计算出来的高度得出来的,而我们并没有设置任何一个label的高度约束;

当然,这多亏了iOS8提供的UITableViewAutomaticDimension;


总结:

在写这篇blog时,内心有些小激动,因为我知道,这将改变我原来对UI布局的诸多认知,也希望对大家有所帮助;

之前还在Xcode中新建了一些类的模板,很受用,再写的话就把这个写了,哈哈^_^;

感谢叶孤城___(简书作者)的iOS进阶指南试读之UI篇”,使这篇文章成为可能。




推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • SmartRefreshLayout自定义头部刷新和底部加载
    1.添加依赖implementation‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.3’implementation‘com.s ... [详细]
  • 详解Android  自定义UI模板设计_由浅入深
    学习安卓已有一些日子,前段时间整理了不少笔记,但是发现笔记不变分享与携带。今天开始整理博客,全当是与大家分享交流与自身学习理解的过程吧。结合最近在做的一个新闻类app及学习中的问题,一点一点整理一下, ... [详细]
author-avatar
同亮uncle_847
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有