iOS - UIView与CALayer&隐式动画与显示动画

每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint

在 View显示的时候,UIView 做为 Layer 的CALayerDelegate,View 的显示内容取决于内部的 CALayer 的 display

CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的action(动画行为)

layer 内部维护着三分layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer

两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以

隐式动画与显示动画:

隐式动画
不需要初始化任何类,系统自己处理的动画属性
粗浅的可以理解为,系统默认,自带的效果
这其实就是所谓的隐式动画。之所以叫隐式是因为我们并没有指定任何动画的类 型。我们仅仅改变了一个属性,然后Core Animation来决定如何并且何时去做动 画。Core Animaiton同样支持显式动画,

核心动画的隐式动画模型假定所有动画图层属性的变化应该是渐进的和异步的。

动态的动画场景可以在没有显式的动画图层时候实现。
改变动画显示的图层的属性将会导致图层隐式把旧值动画显示为新值,虽然动画是持续的,但是设置新的目标值会导致图层从当前状态动画过度到新的目标值

OrderSearchVC *search = [[OrderSearchVC alloc] init];
[self.navigationController pushViewController:search animated:YES];

根据我粗浅的理解,「隐式动画」中的所谓「隐式」,是相对于「显式动画」中的显式而言的。
实现显式动画时,往往会创建一个动画对象,譬如CAAnimation、CABasicAnimation、CAKeyframeAnimation,然后通过CALayer#addAnimation(_:forKey:)方法该动画对象绑定到layer中,

显式动画

核心动画同事提供了一个显示动画模型。该显式动画模型需要你创建一个动画对象,并设置开始值和结束的值,显示动画不会开始执行,直到你把该动画应用到某个图层上面
CABasicAnimation *opAnim = [CABasicAnimation animationWithKeyPath:@opacity];
opAnim.duration = 1.0;
opAnim.fromValue = [NSNumber numberWithFloat:0.1];
opAnim.toValue= [NSNumber numberWithFloat:1.0];
opAnim.repeatCount = 1;
[view.layer addAnimation:opAnim forKey:@animateOpacity];

iOS 动画会改变frame吗?

在iOS开发中,动画本身通常不会直接改变视图的frame属性,但动画的效果会让视图看起来像是在移动、缩放、旋转或改变透明度等。这种视觉上的变化是通过改变视图层的属性(如CALayerpositionboundstransform等)来实现的,而不是直接修改frame

帧(Frame)与层(Layer)

  • 帧(Frame)UIViewframe属性定义了视图在其父视图坐标系统中的位置和大小。这是一个矩形,通常用CGRect结构体表示,包含origin(原点,即左上角的位置)和size(尺寸)。
  • 层(Layer)UIView的底层是由CALayer实现的。CALayer提供了对视图内容渲染的底层支持,包括位置、大小、透明度、边框、阴影等属性的管理。动画效果通常是通过修改CALayer的属性来实现的。

动画与frame

  1. 动画执行:当你对视图应用动画(如使用UIView的动画块或Core Animation框架)时,你通常会修改与动画相关的层属性(如positionboundstransform等)。这些变化会立即反映在视觉上,但frame属性可能不会自动更新以反映这些变化。

  2. framebounds/centerframe是相对于父视图的,而boundscenter是相对于视图自身的。当你通过动画改变视图的位置时(例如,通过修改centerposition),虽然视图在屏幕上移动了,但其frameorigin可能并没有立即更新(因为它仍然表示在父视图坐标系中的原始位置)。但是,如果你通过修改frame本身来移动视图(而不是通过动画),则frame会立即更新,但这种情况下不会有动画效果。

  3. 动画完成后的状态:如果你通过动画改变了视图的位置或大小,并希望这些变化在动画完成后保持下来,你需要确保在动画开始前或在动画的完成回调中手动更新frame属性(如果需要的话)。不过,在很多情况下,由于CALayer的属性(如position)已经改变,所以frame可能会间接地“看起来”已经更新,即使你没有显式地设置它。

结论

动画本身不会直接改变frame,但动画的效果可能会让视图看起来像是改变了位置或大小。如果你需要确保动画完成后的状态与动画过程中的状态一致,你可能需要手动更新frame或其他相关属性。然而,在大多数情况下,通过修改CALayer的属性(如positionboundstransform)来实现动画效果就足够了,因为iOS的视图系统会在底层处理好这些变化与frame之间的关系。

作者:不简单的风度
链接:https://www.jianshu.com/p/ed40da9303b1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

推荐阅读更多精彩内容