iOS Core Animation - Advanced Techniques-学习笔记(二)

图层几何学

视图和图层布局差异

  • 视图上的center,在图层上对应叫position
  • centerposition都代表了当前图层相对于父图层anchorPoint的位置
  • 视图改变frame的实质是改变图层的frame
  • frame是根据boundspositiontransform计算而来,所以当其中任何一个值发生改变,他都会变化。相反,改变frame的值同样会影响到他们当中的值
  • frame的宽高可能和bounds不一致,比如视图旋转后

anchorPoint属性 - 锚点

  • 锚点可以理解为视图的把柄,缩放移动旋转等操作,会相对于锚点进行
  • anchorPoint通过单位坐标描述,默认值是{0.5, 0.5}(图层中心)
  • anchorPoint发生了改变但是position没有改变,所以图层会重新布局,frame会发生改变
  • anchorPoint改变后,建议重新设置frameposition

坐标系操作

  • CALayer提供了点或矩形在不同图层坐标系间转化的方法
- (CGPoint)convertPoint:(CGPoint)point fromLayer:(CALayer *)layer;
- (CGPoint)convertPoint:(CGPoint)point toLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect fromLayer:(CALayer *)layer;
- (CGRect)convertRect:(CGRect)rect toLayer:(CALayer *)layer;
  • 可以通过设置geometryFlipped翻转整个坐标系,他是BOOL型的

图层的三维坐标

  • 图层有zPositionanchorPointZ来描述在Z轴上的位置
  • 图层是一个完全扁平的对象,并没有更多属性来描述他在Z轴上的高度了
  • 图层的zPosition除了使用CATransform3D来渲染3D动画,还可以用来调整图层的显示顺序,通常图层的显示顺序,是使用“画家的算法”不断覆盖上去的,但通过改变zPosition可以将图层顺序前置

图层HitTest

  • CALayer并不关心任何响应事件但是它有一系列的方法帮你处理事件:-containsPoint:-hitTest:
  • -containsPoint:接受一个在本图层坐标系下的CGPoint,如果这个点在图层frame范围内就返回YES
  • -hitTest:方法同样接受一个CGPoint类型参数,但返回的不是BOOL类型,它返回图层本身,或者包含这个坐标点的叶子节点图层
  • -hitTest:的测算的顺序依赖于图层树的顺序,和zPosition改变后显示顺序无关。所以使用zPosition改变图层显示顺序后,事件可能无法响应

视觉效果

圆角

  • conrnerRadius属性控制着图层角的曲率
  • 书中原话是这个曲率值只影响背景颜色而不影响背景图片或是子图层
  • masksToBounds设置成YES的话,子图层超出父图层的区域会被裁剪

图层边框

  • borderWidth描述了图层边框宽度,这个边框的绘制是沿裁剪后的图层边缘,并且绘制在图层边界里面的,而且在所有子内容之前,也在子图层之前
  • borderColor描述了边框颜色信息

阴影

  • 若需要增加阴影表现,只需要更改shadowOpacity属性,他是一个0.0(不可见)和1.0(完全不透明)之间的浮点数
  • 若要改动阴影的表现,你可以使用CALayer的另外三个属性:shadowColorshadowOffsetshadowRadius
  • shadowRadius控制了阴影的模糊度,当它的值是0的时候,阴影就和视图一样有一个非常确定的边界线。当值越来越大的时候,边界线看上去就会越来越模糊和自然。苹果的设计,更倾向于自然阴影,即值为0
  • 阴影路径是根据寄宿图轮廓来确定的
  • 阴影绘制在图层外部,所以masksToBounds设置成YES的话,阴影会被裁剪
  • 如果想沿着内容裁切,又想保留阴影,需要用到两个图层:一个只画阴影的空的外图层,和一个用masksToBounds裁剪内容的内图层
  • 如果在图层渲染前知道阴影形状会是什么样子的,可以指定一个shadowPath来提高性能

图层蒙版

  • 通常创建一个无矩形视图最方便的方法,可以给它指定一个透明蒙板来实现,使用mask属性,这个属性所指向的类型就是CALayer
  • mask图层的color属性是无关紧要的,真正重要的是图层的轮廓。mask属性就像是一个饼干切割机,mask图层实心的部分会被保留下来,其他的则会被抛弃

拉伸过滤

  • 当图片需要显示不同的大小的时候,有一种叫做拉伸过滤的算法就起到作用了。它作用于原图的像素上并根据需要生成新的像素显示在屏幕上

    我的理解例如需要将一张20x20图显示在40x40的图层上,为了避免图片的像素化,通过过滤算法生成新的像素图

  • minificationFiltermagnificationFilter属性描述了在图片需要缩小或拉伸时所用的过滤器算法

  • CALayer对图片的拉伸提供了三种算法

    • kCAFilterLinear - 默认过滤器
    • kCAFilterNearest - 效率非常快,但会使得压缩图片更糟,图片放大之后也显得块状或是马赛克严重
    • kCAFilterTrilinear - 提高了性能,也避免了小概率因舍入错误引起的取样失灵的问题
  • 如果是对于比较小的图或者是差异特别明显,极少斜线的大图,那么kCAFilterNearest既保证效率,同时又会保留最好的呈现效果

    kCAFilterLinear和kCAFilterTrilinear的差异并不明显,如果是简单图,kCAFilterNearest将会是最优选择

组透明

  • UIView的alpha属性和CALayer的opacity属性,这两个属性都是影响子层级的透明度的

  • 理想状况下,当设置了一个图层的透明度,希望它包含的整个图层树像一个整体一样的透明效果,但实际情况,有可能因为透明度的混合叠加造成的

  • 为了避免透明度混合造成的视觉上的混乱,可以使用shouldRasterize属性,来实现组透明的效果。如果设置了这个属性,在应用透明度之前,图层及其子图层都会被整合成一个整体的图片

  • 如果使用了shouldRasterize属性,就要确保你设置了rasterizationScale属性去匹配屏幕,以防止出现Retina屏幕像素化的问题

    btn.layer.shouldRasterize = YES;
    btn.layer.rasterizationScale = [UIScreen mainScreen].scale;
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容