iOS autoLayout总结_a1311010193的博客-程序员宝宝

技术标签: ui  移动开发  swift  

本文转自 http://ruikq.github.io/ios/autolayout/uiscrollview/2015/01/27/iOS-autolayout%E6%80%BB%E7%BB%93.html

 autolayout, and uiscrollview

以前学习iOS的时候没怎么接触过autoLayout,自从iPhone6个6+出来之后一直在为以前的app做适配,所以使用了大量的autoLayout做适配,一开始很不习惯,但是越用越觉得好用,接触到现在遇到很多问题,在这里总结一下,包括三部分:限制的优先级、autoLayout下得UIScrollView和UITableView。

优先级

在一开始autoLayout的使用过程中,优先级常常是被我所忽略掉的,所以有的时候在一些稍微复杂的布局中往往会出现一些很奇怪的问题和警告,尤其是布局一些大小随内容改变的控件时(UIButton、UILabel、UIImageView),而这些问题和警告都可以通过优先级来解决,下面以UILabel为例子来总结一下:

图1

以上是UILabel的限制,都是采用默认的优先级,当点击长文字按钮的时候label上附有长文本,点击短文字按钮则是短的文本。

首先看一下Content Hugging Priority以下部分,一开始使用autolayout的时候我是没有关注到这一部分的。Content Hugging Priority的的意思是限制内容变大优先级,下面对应横向和纵向,Content Compression Resistance Priority是限制内容缩小优先级,最下面的Intrinsic Size则是设置内容固定大小。

为更好理解上述术语的意思,demo中只关注了横向。运行demo无论点击长文字还是短文字按钮label的大小都是不会改变的。下面通过改变一些优先级来使label大小随文字大小改变,首先将label的Trailing的限制优先级改为700,其他不变,然后运行,发现label可随文字变大但不能变小,这是因为label的右边距离父视图的优先级700小于750,所以Trailing Constrain失效,限制内容变小的限制生效,所以当label内容变多时就限制住label变小,但是Content Hugging Priority的优先级为251小于700,当文字少时无法阻止label变大,现在改变Content Hugging Priority为800。

图2

出现警告,期望label宽度0,是因为在storyboard设计阶段自动计算label文字宽度为0,所以label大小也为0;可以通过设置Intrinsic Size 为PlaceHolder去掉警告,这里告诉storyboard设置一个临时占位尺寸,这个占位尺寸仅在storyboard设计阶段有效,不会影响到运行时的尺寸,运行,现在正常了。

图3

UIScrollView

autoLayout下,UIScrollView的contentSize是由其中的内容大小来决定的,依赖关系和正常的子视图依赖父视图是相反的,所以UIScrollView的子视图的布局约束是不可以通过UIScrollView来确定的,所以一般情况下的约束到了UIScrollView中就会出现很多错误和警告。

要处理这种情况就去要确定UIScrollView中子视图的宽和高,但是这又和autoLayout下宽、高的可变性冲突,目前的方法是引进一个锚点视图,子视图的宽和高根据锚点视图确定。

图4

anchorViewForWidth是一个宽和父视图相等,高为0的视图,contentView的高固定、宽度和anchorViewForWidth相等,我们也必须设置contentView的top、trailing、leading、button,这不影响contentView的大小,这相当于是UIScrollView可滚动区域的旁白,所以像这样在一般视图中看上去重复设定限制会发生警告,但在这里就不会出现。

在纵向滑动的UIScrollView项目中contentView的宽度依赖可以这么设置,上面的contentView的高度我们是固定的,但如果高度是随运行时确定的我们就不可以设置固定了,在ios8中像UILabel、UIButton、UIImageView这类大小随内容改变的控件我们是不需要设定高度,系统会自动根据内容计算,如果控件中的内容是动态获得的,我们可以设定placeHolder占位尺寸来进行预设定;

图5

设置placeHolder之后

图6

而对于系统无法计算的控件虽然设置了placeHolder没有了警告,但是运行时控件却不可见,所以只有先设定高度固定再将限制映射为变量,运行时计算修改constant。

图7

UIScrollView中的注意事项

1、有些情况下UIScrollView不能滚动 原因是使用autoLayout之后,在ViewDidLoad之后,系统会重新计算控件的一些值会导致UIScrollView的ContentSize变为(0,0),所以需要在viewDidLayoutSubViews方法中重新设置UIScrollView的contentSize,但有时在ios7上不行,ios7需要在viewDidAppear:animated方法设置contentSize。

UITableView

在UITableView的cell中使用autoLayout,可以根据内容本身来计算cell的高度,在iOS8中只要将tableView.rowHeight设置为UITableViewAutomaticDimension,系统就会根据cell设定好的约束自动计算出高度,在iOS7中需要使用systemLayoutSizeFittingSize:方法来根据约束计算cell的Size,而在iOS6中我们需要手动计算cell的高度。

UITableView使用autoLayout比UIScrollView要简单,唯一让我遇到麻烦的是tableHeaderView,在xib文件中加入tableHeaderView之后是无法改变他的位置的,也不可使用autoLayout增加约束,这就无法动态的改变tableHeaderView的高度;在搜寻了StackOverflow之后发现不需要对tableHeaderView设置autoLayout,想要改变tableHeaderView的高度直接更改frame就可以了。

CGRect headerFrame = self.listView.tableHeaderView.frame; headerFrame.size.height = 47; self.listView.tableHeaderView.frame = headerFrame; [self.listView setTableHeaderView:headerView]; self.listView.contentOffset = CGPointZero;

对于将外部自定义的view作为tableHeaderView,不能将frame大小设置在自定义的view中,必须也要和上面一样重新设置frame,否则会出现tableHeaderView遮挡cell、tableHeaderView拉伸和显示不全等奇怪现象。

总结

autoLayout是ios6就提出来的东西,一开始因为体验差、操作烦用的人很少,但是以后的开发中它是必不可少的,由此我想到了Swift,虽然现在刚刚出现版本还不成熟,但是以后必定是慢慢替代Object_C的,因为苹果不会出一个鸡肋东西。接触autoLayout以来已经有好几个月了,也是适配很多UI,autoLayout是一个越用越顺手的东西,如果出现奇怪的问题就说明某个点还没有掌握,需要再去细细学习。最后附上demo代码

转载于:https://www.cnblogs.com/Camier-myNiuer/p/5075579.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1311010193/article/details/101388170

智能推荐

linux下文件访问时间、修改时间、更改时间_带鱼兄的博客-程序员宝宝

基本概念:linux对每个文件维护3个时间段(访问时间、修改时间、更改时间),它们的意义于图4-19中。在linux下没有创建时间的概念,也就是不能知道文件的建立时间,但如果文件建立后就没有修改过,修改时间=建立时间,但是不能依赖文件内容来判断文件是否被修改,举个例子,用vim打开文件,不做任何修改操作,执行保存退出,修改时间也会被改变成当前时间,而实际上文件内容并没有被改变。

Python、Lua和Ruby——脚本大P.K._mydriverc2的博客-程序员宝宝

http://blog.csdn.net/gzlaiyonghao/article/details/1674808译者按:Python、lua和ruby在C/C++是日渐式微的情况下,在java/.net的围歼中努力抗争的三个当红小生。在Tom Gutschmidt的著作《Game Programmng with Python, Lua and Ruby》一书中,介绍了三种语言在游戏中

ISP——Flicker问题_wtzhu_13的博客-程序员宝宝

ISP——Flicker问题ISP中曝光相关概念1. shutter快门是照相机用来控制感光片有效曝光时间的机构。是照相机的一个重要组成部分,它的结构、形式及功能是衡量照相机档次的一个重要因素。一般而言快门的时间范围越大越好。从工作原理可以分为global shutter 和 rolling shutter,简单的理解global shutter就是整个sensor上的所有像素同时感光,经过相同时间后同时结束感光,而rolling shutter则是行扫描,每一行都得经历重置,曝光,读取数据的过程,然

最近公共祖先详解_cc_奋斗ing的博客-程序员宝宝

最近公共祖先带查询的节点为x和y节点,书的深度为d暴力求解:设置访问数组vis[N],以此遍历x的父节点并做标记,然后再遍历y的父节点,第一个被做标记的就是公共祖先,时间复杂度为O(d)倍增法:f[i][j]代表当前节点向上走2j2^j2j所能走到的节点,其中0≤j≤⌈log(d)⌉0\leq j \leq \lceil log(d) \rceil0≤j≤⌈log(d)⌉,时间复杂度为O(logn),另外还需要设置dist[N]代表节点i到根的距离+1,哨兵:如果从i开始跳2j2^j2j步会跳过根节

一种新的涨分神器!构造code-switching增广数据进行fine-tuning!_机器学习算法与自然语言处理的博客-程序员宝宝

一种新的涨分神器!构造code-switching增广数据进行fine-tuning!原创刘聪NLP机器学习算法与自然语言处理前天公众号关注 “ML_NLP”设为 “星标”,重磅干货,第一时间送达!机器学习算法与自然语言处理出品@公众号原创专栏作者 刘聪NLP学校 | 中国药科大学 药学信息学硕士知乎专栏 | NLP工作站本次分享的论文CoSDA-ML,作者是忆臻老哥 @忆臻,还有国内的两位NLP领域知名的青年才俊老师,车万翔老师和张岳老师,论文收录于IJCAI2020,全名为CoSDA-

EasyUI combobox_weixin_34049948的博客-程序员宝宝

为什么80%的码农都做不了架构师?>>> ...

随便推点

使用python制作矢量图_jwyhappy的博客-程序员宝宝_python矢量图绘制

Get一个使用python制作矢量图的新技能:前言:Matplotlib远比我们想象的强大,而这只是众多python强大的包中的一个,不愧是群英荟萃。绘图后端我们一般是看不见的,matplotlib有两种后端:用户界面后端(用于pygtk、wxpython、tkinter、qt4或macosx;也称为“交互式后端”)和硬拷贝后端制作图像文件(PNG, SVG, PDF, PS;也称为“非交...

error C2440: ’static_cast’_Mirage520的博客-程序员宝宝

<br />转帖:http://blog.csdn.net/stilling2006/archive/2010/06/18/5676794.aspx<br /> <br /> <br />error C2440: “static_cast”: 无法从“void (__thiscall CChatDlg::* )(WPARAM,LPARAM)”转换为“LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)”<br />1>        从基类型到派生类型的强制转换需要 dy

二叉树刷题笔记(1)——LeetCode105_游离态GLZ不可能是金融技术宅的博客-程序员宝宝

最近刷题的时候发现很多搜索啊、动态规划啊,本质上都可以用树来理解,其中递归的思想在做题的时候也让人受益良多。本着复习一下树结构和精进递归思想的目的,最近刷了几题二叉树的题。105. 从前序与中序遍历序列构造二叉树这题保研前练习机试的时候就做过,是一个很能体现二叉树题目套路的题了。二叉树的套路大体上记住两点:(1)递归处理一切问题(2)99%的题目本质上都是前/中/后序遍历,抓住这个套路就...

linux 查看设备挂载信息_Homekit2015的博客-程序员宝宝_查看挂载信息

系统# uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb...

python多个列表排序_python - 根据另一个列表中的值排序列表?_weixin_39525617的博客-程序员宝宝

python - 根据另一个列表中的值排序列表?我有一个像这样的字符串列表:X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1]使用Y中的值对X进行排序以获得以下输出的最短方法是什么?["a", "d", "h", "b", "c", "e", "i",...

自然语言处理——word2vec项目实战—— NLP理论基础_非零因子的博客-程序员宝宝_自然语言处理实战项目

NLP理论基础语料库NLTK : pip install nltkhttp://www.nltk.org//(40条消息) NLTK安装方法_一脑子RMC136的博客-程序员宝宝_nltk安装教程文本处理流程句子→预处理→分词(Tokenize)→特征工程(make features)→机器学习(machine learning)分词(Tokenize)把长句子拆成“有意义”的小部件英文from nltk.tokenize import word_tokenizesentences

推荐文章

热门文章

相关标签