首页 | | 发新文章 | 联系 | 订阅  | 管理

iOS: 在代码中使用Autolayout (2) - intrinsicContentSize和Content Hugging Priority

接上文:iOS: 在代码中使用Autolayout (1) - 按比例缩放和优先级

我们继续来看在代码中使用Autolayout的话题。先说intrinsicContentSize,也就是控件的内置大小。比如UILabel,UIButton等控件,他们都有自己的内置大小。控件的内置大小往往是由控件本身的内容所决定的,比如一个UILabel的文字很长,那么该UILabel的内置大小自然会很长。控件的内置大小可以通过UIView的intrinsicContentSize属性来获取内置大小,也可以通过invalidateIntrinsicContentSize方法来在下次UI规划事件中重新计算intrinsicContentSize。如果直接创建一个原始的UIView对象,显然它的内置大小为0。

继续用代码来写Autolayout,先写一个辅助方法来快速设置UIView的边距限制:

//设置Autolayout中的边距辅助方法

- (void)setEdge:(UIView*)superview
view:(UIView*)view attr:(NSLayoutAttribute)attr
constant:(CGFloat)constant

{

[superview addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:attr relatedBy:NSLayoutRelationEqual toItem:superview attribute:attrmultiplier:1.0 constant:constant]];

}

接下来,创建一个UIView,利用上面的辅助方法快速设置其在父控件的左,上,右边距为20单位。如下代码:

//view1

UIView *view1 = [UIView new];

view1.backgroundColor =
[UIColor yellowColor];

//不允许AutoresizingMask转换成Autolayout

view1.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:view1];

//设置左,上,右边距为20.

[self setEdge:self.view view:view1 attr:NSLayoutAttributeLeft constant:20];

[self setEdge:self.view view:view1 attr:NSLayoutAttributeTop constant:20];

[self setEdge:self.view view:view1 attr:NSLayoutAttributeRight constant:-20];

但是运行后会发现,界面上不会显示任何东西。原因就是上面讲的,UIView默认是没有intrinsicContentSize的。我们可以通过创建一个自定义的UIView来改写intrinsicContentSize。

比如,创建一个新的类型:MyView。

然后在.m文件中改写intrinsicContentSize方法,并返回有效值,比如这样:

//改写UIView的intrinsicContentSize

- (CGSize)intrinsicContentSize

{

return CGSizeMake(70, 40);

}

接着修改最上面的代码,把上面view1变量的类型从UIView替换成我们自定义的View:MyView类型:

MyView *view1 = [MyView new];

再次运行代码,View会按照要求显示在屏幕上:

接下来,按照同样的方式,在下方添加另一个MyView,要求其距离父控件边距左,下,右各为20,代码:

//view2

MyView *view2 = [MyView new];

view2.backgroundColor =
[UIColor yellowColor];

//不允许AutoresizingMask转换成Autolayout

view2.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:view2];

//设置左,下,右边距为20.

[self setEdge:self.view view:view2 attr:NSLayoutAttributeLeft constant:20];

[self setEdge:self.view view:view2 attr:NSLayoutAttributeBottom constant:-20];

[self setEdge:self.view view:view2 attr:NSLayoutAttributeRight constant:-20];

运行后是这样:

接下来,通过代码加入Autolayout中的间距。命令view1和view2上下必须间隔20个单位,注意这里要求view2在view1之下的20单位,所以创建NSLayoutConstraint中view2参数在前面。同时注意,view2的attribute参数是NSLayoutAttributeTop,而view1的attribute参数是NSLayoutAttributeBottom:

//设置两个View上下间距为20

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:view2 attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view1attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20]];

运行结果:

OK,的确,此时view1和view2相互间隔20单位,但是view1被拉伸了。

接下来的任务就是做到如何不让view1拉伸,而让view2拉伸呢?这里就需要使用控件的Content Hugging Priority,这个属性在Xcode中的控件属性中很常见,如下图:

Content Hugging Priority代表控件拒绝拉伸的优先级。优先级越高,控件会越不容易被拉伸。

而下面的Content Compression Resistance Priority代表控件拒绝压缩内置空间的优先级。优先级越高,控件的内置空间会越不容易被压缩。而这里的内置空间,就是上面讲的UIView的intrinsicContentSize。

所以,如果我们把view1(上图中被拉伸的,在上面的View)的Content Hugging Priority设置一个更高的值,那么当Autolayout遇到这种决定谁来拉伸的情况时,view1不会被优先拉伸,而优先级稍低的view2才会被拉伸。

可以直接通过UIView的setContentHuggingPriority:forAxis方法来设置控件的Content Hugging Priority,其中forAxis参数代表横向和纵向,本例中只需要设置纵向,所以传入UILayoutConstraintAxisVertical。整句代码:

//提高view1的Content
Hugging Priority

[view1 setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical];

运行结果:

作者:Mgen 

出处:www.cnblogs.com/mgen 

其他参考页面:我的软件和工程博客导读

intrinsicContentSize和Content Hugging Priority的更多相关文章

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

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

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

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

  3. AutoLayout学习之理解intrinsicContentSize,Content Hugging Priority,Content Compression Resistance Priority

    TableViewCell的高度计算应该是所有开发者都会使用到的东西,之前都是用代码计算的方法来计算这个高度.最近有时间看了几个计算Cell高度的方法.基本上都用到了AutoLayout,这篇首先介绍 ...

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

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

  5. iOS开发 - Content hugging priority & Content compression resistance priority

    1. 什么是Content hugging priority 你可以把它想象成一根放在视图上的橡皮筋. 这根橡皮筋会组织视图超过它本身的固有大小(intrinsic content size). 它存 ...

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

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

  7. Notes of learning AutoLayout

    在XCode5中,如果我们添加一个Button或者Label,或者其他的什么标准View,而不设置任何constraints,IB会自动生成constraints,而这些constraints是fix ...

  8. 关于instrinsicContentSize, ContentHuggingPriority, ContentcompressionResistancePriority的理解

    ios 关于intrinsic理解 最近由于项目的需要想给MBProgressHUD添加一个自定义的view, 结果花费了一两个小时也没添加上去,添加上去的view没有实际的大小,即使你给他设置了一个 ...

  9. iOS布局之Auto Layout

    学习资源: <iOS6核心编程>自动布局部分 <iOS6范例经典>自动布局部分 Tutorial: iOS 6 Auto Layout versus Springs and S ...

随机推荐

  1. gdb常用功能

    1,调试core dump 文件    ulimit -c 1024:设置coredump文件大小为1024,否则默认不会生成coredump文件    gdb -c core:gdb调试该cored ...

  2. asp.net Core 使用redis(StackExchange.Redis)

    原文:asp.net Core 使用redis(StackExchange.Redis) 一.添加配置(appsettings.json) "Redis": { "Def ...

  3. 纯css制作小三角

    在网站制作的过程中常涉及一些小图标,以前大部分会采用小图片.但有了css3后很多变得方便了,比如要在li列表的每行文字的前面加个小三角,可以这么写: <!DOCTYPE html> < ...

  4. 《移山之道》第十一章:两人合作 读书笔记 PB16110698 第六周(~4.15)

     本周在考虑阅读材料时,我翻阅了<移山之道>,正好看到这一章:两人合作,心想:正好,我们正值结对作业的紧要关头,书中两人合作的宝贵经验和教诲应当对我们有很大帮助.于是,我开始一边在ddl苦 ...

  5. Rsync 参数

    # rsync -v, --verbose 详细模式输出 -q, --quiet 精简输出模式 -c, --checksum 打开校验开关,强制对文件传输进行校验 -a, --archive 归档模式 ...

  6. http协议 头部字段 referrer

    学习笔记,非原创,抄自:https://www.cnblogs.com/amyzhu/p/9716493.html:https://blog.csdn.net/java_zhangshuai/arti ...

  7. django 项目分析

    项目要点 一.功能制定 1.用户功能 #.登陆 #.权限组功能 2.数据展示功能 #.列表展示 #.详细信息展示 #.图标展示 3.资源管理功能 #远程管理 #对远程服务器上的进程具有 #开启 #关闭 ...

  8. C++之constexpr

    一.常量表达式:是指值不会改变并且在编译过程就能得到计算结果的表达式.一个对象是不是常量表达式是由它的数据类型和初始值共同决定. ;//虽然初始值是字面值常量,但是它的数据类型只是普通int. con ...

  9. Classpath in jar关于java加载第三方jar的集中方法和详细解释。

    转载地址:http://www.iteye.com/topic/332580 大家都知道一个java应用项目可以打包成一个jar,当然你必须指定一个拥有main函数的main class作为你这个ja ...

  10. STM32F4X 关于MDK上虚拟串口调试

    1. 下载安装VSPD 自行百度安装后,利用VSPD将PC上的两个虚拟串口连接起来.如图我将COM1 和COM2连接起来. a. 点击Addr pair. 可以看到Virtual ports上将两个虚 ...