本文 demo 地址

有的东西虽然基础,但是耐不住人老记性差呀,自己写下来好过次次再搜咯,so......

AnchorPoint 和 Position

AnchorPoint

anchorPoint直译过来就是锚点,layer 以该点为基准进行各种 transform 变换,其值从 (0, 0) 到 (1, 1),默认值为 (0.5, 0.5)。该属性的文档中提到:

'(0, 0)' is the bottom left corner of the bounds rect, '(1, 1)' is the top right corner

这里的说的左下角,是在以屏幕的左上角为原点的坐标系中。而在我们日常生活的坐标系中,原点在屏幕的左下角,那么 (0, 0) 位置则是左上角。

Position

实际表示的是锚点在superLayer中的位置。

两者的联系

单独修anchorPointposition可以修改掉 layer 的位置,但是并不会对另一个属性造成影响。下面例子中,蓝色视图的frame.size = (100.0, 100.0),有一个frame.size = (0, 0, 100.0, 100.0)的黄色子视图。

单独修改anchorPoint

修改锚点
修改锚点前后的输出

单独修改position

修改position
修改position前后的输出

从以上的输出可以看出,单独修改这两个属性,发生改变的其实是黄色视图的frame.origin。不难得到规律:

frame.origin.x = position.x - anchorPoint.x * bounds.size.width
frame.origin.y = position.y - anchorPoint.y * bounds.size.height
复制代码

如果想要修改锚点后,origin位置不发生变化,根据以上公式,则需要相应的修改position,或者直接暴力的修改origin的值。

CALayer 和 UIView 的位置、大小

其实 view 的frameboundscenter都是直接返回了 layer 的frameboundsposition属性。

Frame 和 Bounds

不管frame还是bounds,都需要一个参考坐标系。frame参考的是父视图的坐标系,表示在父视图坐标系中的位置和大小;bounds参考的是自身视图的坐标系,表示在自身视图坐标系中的位置和大小。

Bounds

蓝色视图 A 的frame.size = (100.0, 100.0) ,有一个frame.size = (0, 0, 100.0, 100.0)的黄色子视图 B。在修改 Abounds = (-20, -20, 100.0, 100.0)的时候,如图:

修改bounds

A 的位置不变,B 的位置往右下偏移。因为 A 的origin在其自身坐标系中的位置变为了 (-20, -20),B 的frame.origin还是 (0, 0),表示 B 在 A 的坐标系中位置为 (0, 0),那么 B 的左上角就相对于 A 的左上角向右下各偏移了 20。

UIScrollView 的 contentOffset

初识 UIScrollView 的时候,我以为在拖动它时,是通过修改子视图的frame来产生位移效果的。其实思考一下就会得到子视图位移距离的规律:

translocation.x = subView.frame.origin.x - superview.bounds.origin.x
translocation.y = subView.frame.origin.y - superview.bounds.origin.y
复制代码

刚好 scrollView 的原理其实是修改了自身的bounds,而不是修改子视图的frame

不巧的是,contentOffsetbounds的值又是一模一样的,我们可以理解为它只是bounds属性的一个壳。本文的 demo 中就用了一个 tableView 滚动时输出两个属性证明了以上的几个说法。

转载于:https://juejin.im/post/5cb6d76ae51d456e497a1fee

从 CALayer 的 Position、AnchorPoint 说起相关推荐

  1. IOS笔记CALayer的position和anchorPoint

    IOS笔记CALayer的position和anchorPoint CALayer有2个非常重要的属性:position和anchorPoint @property CGPoint position; ...

  2. 彻底理解CALayer的position与anchorPoint

    引言 相信初接触到CALayer的人都会遇到以下几个问题:   为什么修改anchorPoint会移动layer的位置?  CALayer的position点是哪一点呢?  anchorPoint与p ...

  3. Position anchorPoint 深入

    引言 相信初接触到CALayer的人都会遇到以下几个问题:  为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与posi ...

  4. 详解CALayer的anchorPoint和position

    CALayer CALayer属于QuartzCore框架,用于在iOS和Mac OS系统上可见元素的绘制,和属于UIKit框架的UIView的关系是,UIView默认会创建一个CALayer属性,用 ...

  5. 彻底理解position与anchorPoint - Wonderffee's Blog(转)

    引言 相信初接触到CALayer的人都会遇到以下几个问题:  为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与posi ...

  6. 48.iOS动画和理解position与anchorPoint

    1.动画的基本概念 动画的使⽤场景:iOS中的动画是指一些视图上的过渡效果,合理利用动画能提⾼用户体验,UIView动画影响的属性 frame:视图框架 center:视图位置 alpha:视图透明度 ...

  7. 彻底理解position与anchorPoint

    引言 相信初接触到CALayer的人都会遇到以下几个问题:  为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与posi ...

  8. IOS开发之——Position和AnchorPoint(92)

    一 概述 CAlayer中position和anchorPoint属性说明 position和anchorPoint示意图 二 position和anchorPoint属性说明 CALayer中有2个 ...

  9. iOS CALayer anchorPoint 的应用场景

    背景 最近在看<ios核心动画高级技巧>,这本书的中文版本可以在iOS Core Animation: Advanced Techniques中文译本 这里找到,看到图形几何学这一章,其中 ...

最新文章

  1. 如何在生产环境部署K2的流程
  2. 微信小程序-设置启动页面
  3. javaScript实现字符串首字母大写
  4. Bootstrap+jquery实现页面跳转【小demo】
  5. C语言运算符优先级 (备忘)
  6. Spring集成Quartz定时任务框架介绍
  7. .net core ——微服务内通信Thrift和Http客户端响应比较
  8. 代码能不能不要写得这么烂?!
  9. [转载] 手工制作Win7 OEM版
  10. Web Service实现分布式服务的基本原理
  11. 计算机应用基础的听课记录,听课记录-计算机应用基础
  12. wxpython显示图片_wxpython下图片局部显示的方法
  13. EmptyPage(空白页组件)原理与使用
  14. 引导linux为什么要用实模式,Linux引导过程与故障排除|第1章:Linux启动流程详解...
  15. Linux运维问题解决(2)——Linux设置定时重启系统的方法:定时任务crontab 和 编写脚本
  16. 全球移动支付发展现状移动支付之综述篇
  17. Extjs图书管理系统源码 智能化图书管理系统源码
  18. 【项目管理】启动 - 项目启动会议
  19. silverlight读取mysql_silverlight访问数据库
  20. 国潮正当时,把优秀传统文化融入时代脉搏

热门文章

  1. 学习笔记------tag文件
  2. dataGridView右键菜单并选中该行 http://blog.csdn.net/lanmao100/archive/2009/06/25/4298529.aspx...
  3. ASP.Net中省市级联有关
  4. Net设计模式实例之建造者模式(Builder Pattern)(2)
  5. Glass Dragon
  6. Visual Studio 2017 15.7预览版发布
  7. Linux下统计当前文件夹下的文件个数、目录个数
  8. 前端基础面试题大全-极乐科技(一)-JS部分
  9. iOS—如何申请苹果公司开发者账号流程详细图文介绍(包括邓白氏编码的申请方法详细介绍)...
  10. 常用Linux命令(续)