当使用

CABasicAnimation时,CAConstraintLayoutManager不起作用,原因未知

CoreAnimation编程指南(九)图层布局

发布日期:2012-11-21 浏览次数:7

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];

以上是代码执行过程:

  1. 创建一个CAConstraintLayoutmanager实例,然后把它设置为theLayer的layoutManger的属性。
  2. 创建一个CALayer(layerA)的实例,设置图层的name属性为“layerA”。
  3. 设置layerA的bounds为(0.0,0.0,10.0,25.0)。
  4. 创建一个CAConstraint对象,把它作为约束条件添加到layerA里面。该约束条件是把layerA的水平中心对齐它的父图层的水平中心。
  5. 创建第二个CAConstraint对象,把它作为layerA的约束条件。该约束条件是把layerA的垂直中心对齐父图层的垂直中心。
  6. 把layerA添加为theLayer的子图层。
  7. 创建一个CALayer(layerB)的实例,设置图层的name属性为“layerB”。
  8. 创建一个CAConstraint对象,给layerA添加该约束条件,该约束条件是设置layerB的宽度设置为与layerA的宽度相同。
  9. 创建第二个CAConstraint对象,把该约束条件添加到layerB里面。该约束条件是设置layerB的水平中心对齐layerA的水平中心。
  10. 创建第三个CAConstraint对象,并把它添加为layerB的约束条件。该约束条件设置layerB的顶边低于layerA底边10像素。
  11. 创建第四个CAConstraint对象,把它作为约束条件添加到layerB里面。该约束条件是把layerB的底边高于父图层底边10像素。

注意: 有可能创建约束条件导致在相同的属性的循环引用。在布局是无法计算的情况下,行为结果是不可预知的。

转载于:https://www.cnblogs.com/spiderdzl/p/3714064.html

约束布局管理器 CAConstraintLayoutManager 以及其不起作用相关推荐

  1. 【android编程】 第三讲-Android布局管理器

    android编程 第三讲 Android布局管理器 文章目录 android编程 第三讲 Android布局管理器 约束布局管理器ConstraintLayout 线性布局管理器LinearLayo ...

  2. Swing布局管理器介绍

    当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理.JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout. ...

  3. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  4. GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单 的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能 ...

  5. 3、Swing布局管理器

    在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...

  6. javafx有布局管理器吗_JavaFX技巧17:带有AnchorPane的动画工作台布局

    javafx有布局管理器吗 最近,我不得不为应用程序实现一个布局,其中可以根据用户是否登录来隐藏或显示菜单区和状态区,并通过滑入/滑出动画显示该区域. 以下视频显示了实际的布局: 过去,我可能会使用自 ...

  7. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  8. Java GridBagLayout(网格包布局管理器)

    概述 GridBagLayout(网格包布局管理器)是在网格基础上提供复杂的布局,是最灵活. 最复杂的布局管理器.GridBagLayout 不需要组件的尺寸一致,允许组件扩展到多行多列.每个 Gri ...

  9. GUI(图形用户界面)——AWT概述、布局管理器

    文章目录 1. GUI简介 2. AWT概述 2.1 Component(组件) 2.2 Container(容器) 2.2.1 Window 2.2.2 Panel(面板) 3.布局管理器 3.1 ...

最新文章

  1. 史上最全的Web性能测试工具大全(下 )
  2. Eclipse的SVN插件移动中文名称文件提示org.tigris.subversion.javahl.ClientException: Bogus URL...
  3. 优化SQL步骤—— explain分析执行计划 (explain 之 id)
  4. 打包mac应用_把网址链接打包成电脑软件的制作方法
  5. smartforms长文本处理方式
  6. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:...
  7. 《Java基础入门第2版》--黑马程序员 课后答案及其详解 第1章 Java开发入门
  8. Excel如何快速提取红色字体文本
  9. Navicat连接Oracle数据库
  10. CDA的考试体系与人才能力模型
  11. SDCC和Keil之stc89c52资料(纪念51单片机40周年)
  12. CANopen协议本质
  13. Windows挂载Linux网络共享文件夹
  14. 网页功能升华必备播放器
  15. CodeForces-1016C Vasya And The Mushrooms(模拟+思维+前缀和的前缀和) 解题报告 Apare_xzc
  16. 记一次系统重装后电脑的优化设置
  17. ps2022自学教程:使用Photoshop Mac软件创建动画和音频
  18. 苹果手机有护眼模式吗_睡觉前忍不住刷手机?除了夜间模式,这些护眼小技巧赶快收好!...
  19. HikariCP连接池教程
  20. ELK技术栈-Logstash的详细使用

热门文章

  1. JavaScript 工具库:Cloudgamer JavaScript Library v0.1 发布
  2. RocketMQ源码学习(六)-Name Server
  3. nginx+tomcat+redis负载均衡及session共享
  4. 怎样才能算是在技术上活跃的小公司
  5. 终日奔波只为饥,方才一饱便思衣
  6. SQL中的树型编号处理
  7. 对“流形”最好的讲解在维基
  8. 水很深的深度学习-Task01深度学习概述与数学基础
  9. 提高数据质量的方法有哪些
  10. 大数据技术的表现形式有哪些