本文转自 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为例子来总结一下:

以上是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。

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

UIScrollView

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

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

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

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

设置placeHolder之后

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

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代码

iOS autoLayout总结的更多相关文章

  1. 从此爱上iOS Autolayout

    转:从此爱上iOS Autolayout 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程 ...

  2. 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)

    转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...

  3. iOS AutoLayout自动布局&Masonry介绍与使用实践

    Masonry介绍与使用实践:快速上手Autolayout http://www.cnblogs.com/xiaofeixiang/p/5127825.html http://www.cocoachi ...

  4. iOS - AutoLayout

    前言 NS_CLASS_AVAILABLE_IOS(6_0) @interface NSLayoutConstraint : NSObject @available(iOS 6.0, *) publi ...

  5. iOS — Autolayout之Masonry解读

    前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时 ...

  6. iOS.AutoLayout.2.CustomView-with-AutoLayout

    Custom View Which Support AutoLayout 创建支持AutoLayout的Custom View AutoLayout 通过使view更加的自组织来减轻controlle ...

  7. [转]从此爱上iOS Autolayout

    原文地址 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程.这篇文章两个月前就想写下来,但 ...

  8. IOS AutoLayout 代码实现约束—VFL

    在autolayout下,尽管使用IB来拖放控件,但仍然避免不了用代码来创建控件,这是约束需要代码来实现. IOS 提供了两种添加约束的方法 第一种: +(instancetype)constrain ...

  9. iOS AutoLayout的用法

    添加约束 代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayou ...

随机推荐

  1. 对SingleTask和TaskAffinity的理解(转至 http://www.2cto.com/kf/201311/254450.html)

    最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解.   以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是Sing ...

  2. ps4 如何导出切片 单个图片

    快捷键C,进行切片 按住ctrl+alt+shift+s存储为WEB格式的,在对话框中按ctrl键选中要导出的切片,右边栏中有JPG还有GIF等格式的,下面选仅选图像,即可,如果你没有设置的话,电脑有 ...

  3. Windows命令处理进程

    1.  查看进程命令 tasklist 2.以翻页模式查看进程 tasklist  |  more 3.搜索关键字查找进程 tasklist  |  findstr  "cmd" ...

  4. R语言ggplot2 简介

    ggplot2是一个绘制可视化图形的R包,汲取了R语言基础绘图系统(graphics) 和l attice包的优点,摒弃了相关的缺点,创造出来的一套独立的绘图系统: ggplot2 有以下几个特点: ...

  5. iOS: hide UITextField Cursor

    Simply subclass UITextField and override caretRectForPosition (继承 UITextField 并且重写 [UITextField care ...

  6. PHP安全之临时文件的安全

    (一)临时文件简介临时文件,顾名思义是临时的文件,文件的生命周期短.然而,很多应用的运行都离不开临时文件,临时文件在我们电脑上无处不在,通常有以下几种形式的临时文件: 文件或图形编辑程序,所生成的中间 ...

  7. 基于Java对图片进行二值化处理

    一直以来对Java的图形处理能力表无力,但好像又不是那么一回事,之前用PHP做过一些应用,涉及到验证码的识别,其中有个图片二值化的步骤,今天换成Java来实现下 在java的扩展包javax.imag ...

  8. Node.js版本管理工具 nvm

    1. 下载安装 curl curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash wge ...

  9. 2 go语言的基础

    include 内置关键字 注释方法 代码结构(常量,变量,接口,函数的定义) 导入包以及包别名 可见性规则 小练习 内置关键字(25个均为小写) break case chan const cont ...

  10. sql产生随机数

    使用RAND(),结果是类似于这样的随机小数:0.615942003695649 SELECT FLOOR(RAND()*N) ---生成的数是这样的:12.0  SELECT CAST(FLOOR( ...