前言

本文主要侧重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属性值有默认值:

  1. 对于纯代码添加的控件,Hugging默认250.0f,Compression默认 750.0f
  2. 通过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使用注意的更多相关文章

  1. iOS开发之AutoLayout中的Content Hugging Priority和 Content Compression Resistance Priority解析

    本篇博客的内容也不算太复杂,算是AutoLayout的一些高级的用法.本篇博客我们主要通过一些示例来看一下AutoLayout中的Content Hugging Priority以及Content C ...

  2. xcode中使用xib添加autolayout中constrain to margins的不同

    在使用xcode7 在storyboard中添加autolayout中发现 如果添加在view 直接添加到viewcontroller的view 上 constrain to margins    只 ...

  3. iOS Core Animation具体解释(四)AutoLayout中的动画

    原创blog.转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  4. 转:AutoLayout中的Content Hugging 和 Content Compression Resistance

    OS6中引入了AutoLayout,极大的方便了UI元素的布局,现在已经过去一年了,并且大部分设备的系统也已经升级到了iOS6,是时候要使用此项技术了. 在AutoLayout的学习中有两个概念官方文 ...

  5. 怎样在 AutoLayout 中使用 UIScrollView (多个ContentView)

    http://codehappily.wordpress.com/2013/11/14/ios-how-to-use-uiscrollview-with-autolayout-pure-autolay ...

  6. iOS-AutoLayout中动画使用的细节 和 iOS layout机制

    在Main.storyboard拖入一个UIView,随便设置一个背景色, 使用autolayout  为紫色的view添加约束 :(0,0,100,100) , 为该view添加动画代码如下: #i ...

  7. AutoLayout中使用UIScrollView

    UIScrollView 在 Auto Layout 是一个很特殊的 view,对于 UIScrollView 的 subview 来说,它的 leading/trailing/top/bottom ...

  8. 在代码中使用Autolayout – intrinsicContentSize和Content Hugging Priority

    我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大 ...

  9. iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority【转】

    原文:http://www.mgenware.com/blog/?p=491 接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autola ...

随机推荐

  1. SublimeText 批量清除空行

    sublimeText 编辑器批量清除空行: 1.CTRL+H 打开 replace 功能 2.选择 Regular expression 功能 3.批两替换  点击replace All

  2. Install and Configure OSSEC on Debian 7&8

    Install and Configure OSSEC on Debian 7&8 Contributed by Sunday Ogwu-Chinuwa Updated Friday, Feb ...

  3. Aspose.Pdf v8.4.1 发布

    .NET v8.4.1: 修复的错误及漏洞: PDF到JPEG时,内容从最终JPEG文件中丢失. 书签缩放识别错误.  Java v4.2: 新特性: 搜索分离超过两行的文本. 修复的异常: PDF到 ...

  4. GPG error: http://extras.ubuntu.com trusty Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F60F4B3D7FA2AF80

    今天在更新运行apt-get update的时候出现了如下的错误: W: GPG error: http://extras.ubuntu.com trusty Release: The followi ...

  5. DHCP服务搭建

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

  6. 京东原来你运用的这玩意,不错,我也要!! ContainerDNS

    转自社区 ContainerDNS 本文介绍的 DNS 命名为 ContainerDNS,作为京东商城软件定义数据中心的关键基础服务之一,具有以下特点: 分布式,高可用 自动发现服务域名 后端探活 易 ...

  7. Docker解决没有vi、vim等命令

    1.apt update 同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,获取到最新的软件包. 2.apt install vi ...

  8. git 和github

    ssh git:    是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这 ...

  9. 获取应用程序 或Web页面目录的路径

    一.Winform获取本程序的路径 1.获取当前目录 返回最后不带“\”的目录:如D:\Winform\bin\Debug System.Windows.Forms.Application.Start ...

  10. 把所有的小图标一起做成雪碧图吧 请用gulp-css-spriter.

    用gulp-css-spriter很简单. 第一步: 在某个文件夹用shitf+鼠标右键 第二步: npm install gulp-css-spriter https://www.npmjs.com ...