转:AutoLayout中的Content Hugging 和 Content Compression Resistance

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

在AutoLayout的学习中有两个概念官方文档讲述的不是很清楚,今天花费了2个小时的时间研究了一下,在此总结一下。

Content Hugging 和 Content Compression Resistance

这两个属性对有intrinsic content size的控件(例如button,label)非常重要。通俗的讲,具有intrinsic content size的控件自己知道(可以计算)自己的大小,例如一个label,当你设置text,font之后,其大小是可以计算到的。关于intrinsic content size官方的解释:

Custom views typically have content that they display of which the layout system is unaware. Overriding this method allows a custom view to communicate to the layout system what size it would like to be based on its content. This intrinsic size must be independent of the content frame, because there’s no way to dynamically communicate a changed width to the layout system based on a changed height, for example.

好了,了解了intrinsic content size的概念之后,下面就重点讨论Content Hugging 和 Content Compression Resistance了。

UIView中关于Content Hugging 和 Content Compression Resistance的方法有:

- (UILayoutPriority)contentCompressionResistancePriorityForAxis:(UILayoutConstraintAxis)axis

- (void)setContentCompressionResistancePriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis

- (UILayoutPriority)contentHuggingPriorityForAxis:(UILayoutConstraintAxis)axis

- (void)setContentHuggingPriority:(UILayoutPriority)priority forAxis:(UILayoutConstraintAxis)axis

大概的意思就是设置优先级的。

Hugging priority 确定view有多大的优先级阻止自己变大。

Compression Resistance priority确定有多大的优先级阻止自己变小。

很抽象,其实content Hugging就是要维持当前view在它的optimal size(intrinsic content size),可以想象成给view添加了一个额外的width constraint,此constraint试图保持view的size不让其变大:

view.width <= optimal size

此constraint的优先级就是通过上面的方法得到和设置的,content Hugging默认为250.

Content Compression Resistance就是要维持当前view在他的optimal size(intrinsic content size),可以想象成给view添加了一个额外的width constraint,此constraint试图保持view的size不让其变小:

view.width >= optimal size

此默认优先级为750.

还是很抽象,好吧,下面举个例子就明白了。

[objc] view plaincopyprint?

  1. button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  2. button1.translatesAutoresizingMaskIntoConstraints = NO;
  3. [button1 setTitle:@"button 1 button 2" forState:UIControlStateNormal];
  4. [button1 sizeToFit];
  5. [self.view addSubview:button1];
  6. NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:100.0f];
  7. [self.view addConstraint:constraint];
  8. constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:100.0f];
  9. [self.view addConstraint:constraint];
  10. constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-150.0f];
  11. constraint.priority = 751.0f;
  12. [self.view addConstraint:constraint];

运行效果如下:

代码很容易理解,创建一个button,设置其constraint,使其距离顶部100,距离左边100,距离右边150,注意右边的constraint的优先级我们设置的为751.0,此时autolayout系统会去首先满足此constraint,再去满足Content Compression Resistance(其优先级为750,小于751)。

当我们把751变为749的时候,效果如下:

这时就是先满足了Content Compression Resistance的constraint,因为其优先级高。

下面举的例子为Content Hugging的例子,代码如下:

[cpp] view plaincopy

  1. button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  2. button1.translatesAutoresizingMaskIntoConstraints = NO;
  3. [button1 setTitle:@"button 1 button 2" forState:UIControlStateNormal];
  4. [button1 sizeToFit];
  5. [self.view addSubview:button1];
  6. NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeading multiplier:1.0f constant:100.0f];
  7. [self.view addConstraint:constraint];
  8. constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0f constant:100.0f];
  9. [self.view addConstraint:constraint];
  10. constraint = [NSLayoutConstraint constraintWithItem:button1 attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTrailing multiplier:1.0f constant:-10.0f];
  11. constraint.priority = 251.0f;
  12. [self.view addConstraint:constraint];

运行效果如下:

当把优先级priority改为249的时候,效果如下:

这个就不用解释了吧。

时间: 2024-10-11 13:46:22

转:AutoLayout中的Content Hugging 和 Content Compression Resistance的相关文章

iOS autolayout的Content Hugging 和 Content Compression Resistance

Content Hugging 和 Content Compression Resistance 这两个属性对有intrinsic content size的控件(例如button,label)非常重要.通俗的讲,具有intrinsic content size的控件自己知道(可以计算)自己的大小,例如一个label,当你设置text,font之后,其大小是可以计算到的.关于intrinsic content size官方的解释: Hugging priority 确定view有多大的优先级阻止

详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance [转]

在了解intrinsicContentSize之前,我们需要先了解2个概念: AutoLayout在做什么 约束优先级是什么意思. 如果不了解这两个概念,看intinsic content size没有任何意义. 注:由于上面这几个概念都是针对UIView或其子类(UILabel,UIImageView等等)来说的.所以下文中都用UIView指代. AutoLayout在做什么 – 一个UIView想要显示在屏幕中,仅须有2个需要确定的元素,一是位置,二是大小.只要2者确定,UIView就可以正

详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance

在了解intrinsicContentSize之前,我们需要先了解2个概念: AutoLayout在做什么 约束优先级是什么意思. 如果不了解这两个概念,看intinsic content size没有任何意义. 注:由于上面这几个概念都是针对UIView或其子类(UILabel,UIImageView等等)来说的.所以下文中都用UIView指代. AutoLayout在做什么 – 一个UIView想要显示在屏幕中,仅须有2个需要确定的元素,一是位置,二是大小.只要2者确定,UIView就可以正

iOS开发 - Content hugging priority &amp; Content compression resistance priority

1. 什么是Content hugging priority 你可以把它想象成一根放在视图上的橡皮筋. 这根橡皮筋会组织视图超过它本身的固有大小(intrinsic content size). 它存在一个优先级,从0到1000. 1000表示视图绝对不能超过intrinsic content size. 我们来看个例子: 上图中有两个横向排列的标签控件(label),并且你也已经设置好了约束. 这个会工作正常,直到父视图变宽的时候. 那么,问题来了. 如果父视图变宽了,那个label应该变宽呢

在代码中使用Autolayout (2) – intrinsicContentSize和Content Hugging Priority

接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长.控件的内置大小可以通过UIView的intrinsicContentSize属性来获取内置大小,也可以通

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

原文:http://www.mgenware.com/blog/?p=491 接上文:iOS: 在代码中使用Autolayout (1) – 按比例缩放和优先级. 我们继续来看在代码中使用Autolayout的话题.先说intrinsicContentSize,也就是控件的内置大小.比如UILabel,UIButton等控件,他们都有自己的内置大小.控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长.控件的内置大小可以通过UI

web.xml中&lt;web-app&gt;报错了--The content of element type &quot;web-app&quot; must match

web.xml中<web-app>报错了--The content of element type "web-app" must match.真是活见鬼! 查完资料后发现,原来web-app_2_3.dtd规范有规定,里面配置的内容要按照规定的顺序来,如下: (icon?,display-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,se

iOS content Hugging Priority

1.Content Hugging Priority和Content Compression Resistance Priority Content Hugging:内容压缩,阻止视图的实际尺寸比intrinsicContentSize返回的更大 Content Compression Resistance:阻止内容压缩,阻止视图的实际尺寸比intrinsicContentSize返回的更小. Content Hugging Priority:内容压缩优先级,默认为250 Content Com

爬虫中 r.text 与 r.content 的区别

1.简单粗暴来讲: text 返回的是unicode 型的数据,一般是在网页的header中定义的编码形式. content返回的是bytes,二级制型的数据. 如果想要提取文本就用text 但是如果你想要提取图片.文件,就要用到content 2.详细一点来讲: 用了request.get方法后,返回一个response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等. 其中返回的网页部分会存在.content和.text两个对象中.如果需要获得这些网页原始数据,我们可以