Autolayout中Hugging和Compression使用注意
前言
本文主要侧重Autolayout使用过程中,通过代码和SB添加含有intrinsicSize属性控件约束的一些细节。
来自我的博客,欢迎访问:To Be Independent.
Hugging和Compression 属性
有很多关于这两个概念的文章,比如stackoverflow上Cocoa Autolayout: content hugging vs content compression resistance priority。我觉得很形象的说明了设置了有什么用,但是还欠缺什么时候使用,即和`intrinsicSize`的关系。先来看下文档上的说明:
- contentCompressionResistancePriorityForAxis:
//Returns the priority with which a view resists being made smaller than its intrinsic size. - contentHuggingPriorityForAxis:
//Returns the priority with which a view resists being made larger than its intrinsic size.
这么一看,就很明了:对于有 intrinsicSize 属性的控件(如UILabel,UIButton等),如果当前的frame比显示的content范围大,那么设置的Hugging属性起作用,否则设置的Compression属性起作用。对于相应的数值,越大表明优先级越高,意味着当前的属性占优。简单的说,对于需要Hugging的情形,hugging属性的值越大(优先级越高),那么表明控件需要紧凑的显示。
Hugging和Compression属性值有默认值:
- 对于纯代码添加的控件,Hugging默认250.0f,Compression默认 750.0f
- 通过SB添加,Hugging默认251.0f,Compression默认750.0f
为什么会有不一样的值?那么先看一下 UILayoutPriority的取值:
static const UILayoutPriority UILayoutPriorityRequired NS_AVAILABLE_IOS(6_0) = ; // A required constraint. Do not exceed this. static const UILayoutPriority UILayoutPriorityDefaultHigh NS_AVAILABLE_IOS(6_0) = ; // This is the priority level with which a button resists compressing its content. static const UILayoutPriority UILayoutPriorityDefaultLow NS_AVAILABLE_IOS(6_0) = ; // This is the priority level at which a button hugs its contents horizontally. static const UILayoutPriority UILayoutPriorityFittingSizeLevel NS_AVAILABLE_IOS(6_0) = ;// 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.
由此可见,在设计的时候,iOS的开发人员考虑到类似UILabel的控件首要的是显示所有的内容。
编程实现
通过一段代码,加载一个button:
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.translatesAutoresizingMaskIntoConstraints = NO;
button.backgroundColor = [UIColor redColor];
[button setTitle:@"a long long title" forState:UIControlStateNormal];
[self.view addSubview:button]; NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:100.0f];
[self.view addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:100.0f];
[self.view addConstraint:constraint]; constraint = [[NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier: constant:50.0f];
[self.view addConstraint:constraint];
如上添加的constraint,使得button的frame不足以显示标题内容,注意上述constraint默认的优先级都是UILayoutPriorityRequired。因此我们可以通过修改最后一个宽度的constraint:
constraint.priority = UILayoutPriorityDefaultHigh - ;
对于用SB添加的控件,也可以用类似的方法修改。至于为什么,SB中添加的如UILable的控件,当给其添加某个约束后,SB中Hugging属性的值是251呢?这是为了默认可以显示全内容。此时,你可以在sb中手动把空间尺寸变小,再把控件的某个属性的constriant(width或tailing)的优先级设置为low。这时,你也可以在SB中发现相应的约束由蓝色实线变成了蓝色虚线。当然,如果compression约束起作用的情况下,约束也是蓝色虚线。
与其它控件一起使用
如上单个控件可以正常使用,如果设置一个相邻的控件,会有什么需要注意的吗?答案是NO,什么都不需要操心,仍旧按之前的方法添加约束,这极大的简化了工作量。
另外,这里需要说明的是,需要更新控件上文字的时候,为了有一个较好的动画效果,需要:
[label.superView layoutIfNeeded];
Autolayout中Hugging和Compression使用注意的更多相关文章
- iOS开发之AutoLayout中的Content Hugging Priority和 Content Compression Resistance Priority解析
本篇博客的内容也不算太复杂,算是AutoLayout的一些高级的用法.本篇博客我们主要通过一些示例来看一下AutoLayout中的Content Hugging Priority以及Content C ...
- xcode中使用xib添加autolayout中constrain to margins的不同
在使用xcode7 在storyboard中添加autolayout中发现 如果添加在view 直接添加到viewcontroller的view 上 constrain to margins 只 ...
- iOS Core Animation具体解释(四)AutoLayout中的动画
原创blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...
- 转:AutoLayout中的Content Hugging 和 Content Compression Resistance
OS6中引入了AutoLayout,极大的方便了UI元素的布局,现在已经过去一年了,并且大部分设备的系统也已经升级到了iOS6,是时候要使用此项技术了. 在AutoLayout的学习中有两个概念官方文 ...
- 怎样在 AutoLayout 中使用 UIScrollView (多个ContentView)
http://codehappily.wordpress.com/2013/11/14/ios-how-to-use-uiscrollview-with-autolayout-pure-autolay ...
- iOS-AutoLayout中动画使用的细节 和 iOS layout机制
在Main.storyboard拖入一个UIView,随便设置一个背景色, 使用autolayout 为紫色的view添加约束 :(0,0,100,100) , 为该view添加动画代码如下: #i ...
- AutoLayout中使用UIScrollView
UIScrollView 在 Auto Layout 是一个很特殊的 view,对于 UIScrollView 的 subview 来说,它的 leading/trailing/top/bottom ...
- 在代码中使用Autolayout – intrinsicContentSize和Content Hugging Priority
我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大 ...
- iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority【转】
原文:http://www.mgenware.com/blog/?p=491 接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autola ...
随机推荐
- html5 文档元素 header footer h1h2h4
文档元素: 用于在页面的大布局, 区分各个主体和概念. 让整体清晰, 元素有语义, 进一步代替div 具体划分图示: (参考) <hgroup> <section> <n ...
- 浏览器根对象window之performance
W3C性能小组引入的新的API,目前IE9以上的浏览器都支持. 为了解决当前性能测试的困难,W3C推出了一套性能API标准,各种浏览器对这套标准的支持如今也逐渐成熟起来.这套API的目的是简化开发者对 ...
- Java 之集合框架 上(9)
Java 中的集合框架 如果一个类中存在很多相同类型的属性. 例如:学生类 学生可以选课,因此存在很多课程类型的属性.但是每个学生选择的课程的种类和数量是不一样的. 如果将每一个课程类型的属性都列到课 ...
- js堆栈内存的释放
### JS中的堆栈内存 > 俗称叫做作用域(全局作用域/私有作用域) > - 为js代码提供执行的环境(执行js代码的地方) > - 基本数据类型值是直接存放在栈内存中的 > ...
- Hadoop配置文件详解
1 获取默认配置 配置hadoop,主要是配置core-site.xml,hdfs-site.xml,mapred-site.xml三个配置文件,默认下来,这些配置文件都是空的,所以很难知 ...
- PHP调优
目录 php.ini 内存 Zend OPcache 文件上传 最长执行时间 处理会话 缓冲输出 真实路径缓存 php.ini PHP解释器在 php.ini 文件中配置和调优.web和cli使用的路 ...
- 使用 ruamel.yaml 读写 yaml 文档
官网链接: https://pypi.org/project/ruamel.yaml/ 1. 安装ruamel.yaml pip install ruamel.yaml 2. 准备yaml文件: Ch ...
- [T-ARA][Cry Cry]
歌词来源: Cry Cry:http://music.163.com/#/song?id=22704434 Cry Cry (Ballad Ver.):http://music.163.com/#/s ...
- 中间人攻击利用框架bettercap测试
0x00前言 上篇提到内网渗透很有趣,这次就从一款新工具说起: bettercap 0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名 ...
- python接口测试:自动保存cookies
接口测试中遇到上一个请求返回响应包含cookie(如下图登录请求的响应结果).需将cookies保存下来,后续请求自动带入,否则会提示未登录. python requests的cookie类型是< ...