NSView提供了经典的“stuts and springs”模式,用于视图调整大小的时候把关联到它父图层的视图重新调整位置。图层支持该模式,而且Mac OS X上面的核心动画提供了一个更通用的布局管理器机制,允许开发者自己写他们自己的布局管理器。可以为图层定制一个布局管理器(它通常实现CALayoutManager协议),负责给图层的子图层提供布局功能。
  本章介绍了约束布局管理器和如何配置一系列约束条件。
  iOS 注意:iOS的CALayer类仅提供“stuts and springs”模式,不提供定制的布局管理器。然而如果你想人工修改关联到特别视图的图层的位置的话,你可以重载相应视图的layoutSubviews方法,在这里面实现你定制的布局代码。你可以查看“iOS视图编程指南(View Programming Guide for iOS)”来获取更多关于如何在iOS应用里面基于视图的布局方法。
 
1.1 约束布局管理器
  基于条件的布局允许你根据图层和它同级图层或者它的父图层的相应关系指定图层的位置和大小。通过CAConstraint类描述的关系被保存在子图层的constraints数组属性里面。
  图1描述了在指定关系的的时候你可以使用的布局特性。
  Figure 1  布局管理器constraints属性
   
 
  当使用约束布局的时候,你首先创建一个CAConstraintLayoutManager的实例,并把它设置为父图层的布局管理器。然后你通过实例化CAConstraint对象为子图层创建约束条件,并把这些约束条件通过使用addConstraint:方法添加到子图层的约束属性里面。每个CAConstraint实例封装了一个两个图层在同一轴上的几何关系。
  同级层引用的名称,使用图层的name属性。特定的名称superlayer被使用来引用图层的父图层。
  每个轴上面最多只能指定两个关系。如果你给图层的左边和右边都指定约束关系,那么图层的宽度就会不同。如果你给图层的左边和宽度指定约束关系,则图层的右边就会从根据父图层的frame移动。通常你一般只会指定单个边的约束条件,图层在同一个轴上面的大小将会作为第二个约束关系。
  代码1里面的示例代码创建了一个图层,然后使用位置约束条件添加子图层。图2描述了布局的结果。
  Figure 2  基于示例中constraints的布局
     
  代码 1  配置 layer的 constraints
  // create and set a constraint layout manager for theLayer
  theLayer.layoutManager=[CAConstraintLayoutManager layoutManager];
 
  CALayer *layerA = [CALayer layer];
  layerA.name = @"layerA";
 
  layerA.bounds = CGRectMake(0.0,0.0,100.0,25.0);
  layerA.borderWidth = 2.0;
 
  [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidY
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMidY]];
 
  [layerA addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMidX]];
 
  [theLayer addSublayer:layerA];
 
  CALayer *layerB = [CALayer layer];
  layerB.name = @"layerB";
  layerB.borderWidth = 2.0;
 
  [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintWidth
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintWidth]];
 
  [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMidX
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintMidX]];
 
 
  [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMaxY
                                                 relativeTo:@"layerA"
                                                  attribute:kCAConstraintMinY
                                                     offset:-10.0]];
 
  [layerB addConstraint:[CAConstraint constraintWithAttribute:kCAConstraintMinY
                                                 relativeTo:@"superlayer"
                                                  attribute:kCAConstraintMinY
                                                     offset:+10.0]];
 
  [theLayer addSublayer:layerB];
  
  以上是代码执行过程:
  创建一个CAConstraintLayoutmanager实例,然后把它设置为theLayer的layoutManger的属性。  
  创建一个CALayer(layerA)的实例,设置图层的name属性为“layerA”。  
  设置layerA的bounds为(0.0,0.0,10.0,25.0)。
  创建一个CAConstraint对象,把它作为约束条件添加到layerA里面。该约束条件是把layerA的水平中心对齐它的父图层的水平中心。
  创建第二个CAConstraint对象,把它作为layerA的约束条件。该约束条件是把layerA的垂直中心对齐父图层的垂直中心。
  把layerA添加为theLayer的子图层。 
  创建一个CALayer(layerB)的实例,设置图层的name属性为“layerB”。
  创建一个CAConstraint对象,给layerA添加该约束条件,该约束条件是设置layerB的宽度设置为与layerA的宽度相同。
  创建第二个CAConstraint对象,把该约束条件添加到layerB里面。该约束条件是设置layerB的水平中心对齐layerA的水平中心。
  创建第三个CAConstraint对象,并把它添加为layerB的约束条件。该约束条件设置layerB的顶边低于layerA底边10像素。
  创建第四个CAConstraint对象,把它作为约束条件添加到layerB里面。该约束条件是把layerB的底边高于父图层底边10像素。
  注意: 有可能创建约束条件导致在相同的属性的循环引用。在布局是无法计算的情况下,行为结果是不可预知的。

转自梦维:http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-ix-layer-layout.html

CoreAnimation编程指南(九)图层布局相关推荐

  1. CoreAnimation编程指南(四)图层树结构

    图层不但给自己提供可视化的内容和管理动画,而且充当了其他图层的容器类,构建图层层次结构.  本章介绍了图层层次结构,以及如何操纵该图层层次结构.   一.什么是图层树的层次结构 1.图层树是核心动画里 ...

  2. CoreAnimation编程指南(七)图层Action

    图层的行为在以下情况发生的时候被触发:从图层树里面插入或者删除一个图层,图层的属性值被修改了,或者程序显式要求.通常情况下,行为触发器是动画显示的结果所在.   1.1 行为对象的角色   一个行为对 ...

  3. CoreAnimation编程指南(五)图层内容

    当我们使用Cocoa的视图的时候,我们必须继承NSView或者UIView并且重载函数drawRect:来显示任何内容.但是CALayer实例可以直接使用,而无需继承子类.因为CALayer是一个键- ...

  4. CoreAnimation编程指南(简介)

    一.核心动画编程介绍    1.本文档介绍了在使用核心动画时所涉及的基本概念.核心动画的是Objective – C的框架,它通过简单的动画编程接口来提供一套高性能的动画引擎.    2.你应该阅读此 ...

  5. CoreAnimation编程指南(简介)转自:http://www.dreamingwish.com/

    核心动画编程介绍 本文档介绍了在使用核心动画时所涉及的基本概念.核心动画的是Objective – C的框架,它通过简单的动画编程接口来提供一套高性能的动画引擎. 你应该阅读此文档来理解Cocoa应用 ...

  6. iOS之有关动画的总结/CoreAnimation编程指南、简单动画实例

    facebook的动画框架pop:https://github.com/facebook/pop or 核心动画类有以下分类: 提供显示内容的图层类. 动画和计时类. 布局和约束类. 事务类,在原子更 ...

  7. CoreAnimation编程指南(六)动画 转自:http://www.dreamingwish.com/

    http://www.dreamingwish.com/dream-2012/coreanimation-programming-guide-f-animation.html 动画是当今用户界面的关键 ...

  8. CoreAnimation编程指南(六)动画

        动画是当今用户界面的关键因素.当使用核心动画的时候,动画是自动完成的.没有动画的循环和计数器.你的应用程序不负负责重绘,也不负责跟踪动画的当前状态.动画在独立线程里面自动执行,没有和你的应用程 ...

  9. CoreAnimation编程指南(一)概念

    一.概述 1.核心动画是一套包含图形绘制,投影,动画的Objective–C类集合.它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流 ...

最新文章

  1. 用图解释RNN运行的部分过程
  2. 直播回顾丨神策数据王朋:如何搭建一套高可用的前端异常监控系统?
  3. 64. Minimum Path Sum 最小路径和
  4. 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll 尝试重新安装此程序以解决此问题...
  5. linux如何运行sh监控文件夹,如何使用Shell进行文件监控?
  6. @Entity,@Indexed @XmlRootElement
  7. 计划任务文件 linux,Linux计划任务Crontab学习笔记(3):配置文件
  8. linux:如何修改用户的密码
  9. XMLHttpRequest.responseType
  10. react native中使用 react-native-easy-toast 和react-native-htmlview
  11. 解决MATLAB不能设置为.m .slx .mat等文件默认打开方式
  12. 魔兽世界燃烧的远征服务器状态,暴雪战网读入经典TBC服务器,魔兽世界燃烧的远征即将起航...
  13. 我们的地盘,我们做主
  14. C语言学生管理系统(期末作业,超详细哟,拿走不谢!!!)
  15. 互联网赚钱:死磕和专注
  16. OPPO R11S识别不到ADB Device
  17. Qt网络编程电子白板
  18. Image加载二进制数据图片
  19. 建筑建材行业渠道商管理系统助力企业掌控市场信号,提速业务决策
  20. 用自有工作站做服务器建网站,服务器搭建工作站

热门文章

  1. CSS-Transform-transition-Animation
  2. string.Format格式化输出
  3. [转帖]FPGA--Vivado
  4. Lucene正则表达式查询RegenxQuery
  5. hadoop伪分布式配置
  6. MFC关键技术-消息映射机制
  7. jsp--cookie
  8. Leetcode--342. 4的幂
  9. oracle的一些常使用命令,Oracle 经常使用命令小结
  10. mugen4g补丁如何使用_CAD如何去除教育版戳记?