KVC(Key Value Coding)和KVO(Key Value Observer)
要在NSLog中输出有意义的对象,需要重写对象的description方法。要不只会输出对象的指针,而非对象内容
对象设置属性值时,person.name = @"Jake"的写法如果用KVC方式写的话则是[person setValue:@"Jake" forKey:@"name"],KVC的最大好处是可以降低对象之间的耦合度。或者属性是另一个对象时可使用KeyPath:[person set Value@"321" forKeyPath:@"card.no"];
取值则是[person valueForKey:@"name"],有对象层次关系时用[person valueForKeyPath:@"card.no"];
KVC的另外一个好处是可以使用一个dictionary将对象进行赋值初始化:如
Person *p = [[Person alloc] init];
[p setValuesForKeysWithDictionary:dictionary];
KVO 给一个对象添加观察者对象
给一个对象添加观察者对象可以监测该对象属性的变化,当改对象任意属性值发生变化时,设定的代理方法就被调用。给一个对象添加观察者的方法是调用对象的addObserver: forKeyPath: options: context:方法,所选择的观察者对象需要实现代理方法observeValueForKeyPath
注意:
1. 当监测结束时,需要移除观察者对象: removeObserver
2. 添加了观察者的对象需要是强引用或者被其他强引用对象弱引用了,要不观察者对象会和被销毁的对象绑定。
CALayer的基本使用
每一个UIView内部都有一个layer的属性,在实现核心动画的时候,本质上是将CALayer中的内容转换成位图,从而便于图形硬件的操作。
UIView和CALayer的关系:创建视图对象时,视图会自己创建一个图层,视图在绘图(如drawRect:)时,会将内容画在自己的根图层上。当视图在图层上完成绘图后,系统会将图层拷贝至屏幕。每个视图都有一个层,而每个图层又可以有多个子层。
Layer的设计目的是提供视图的基本可视内容,从而提高动画的执行效率,而不是为了取代视图。除提供可视内容外,Layer不负责视图的时间响应,内容绘制等工作,同时Layer不能参与到响应者链条中。
使用CALayer时的注意事项:
1. UIView中的CALayer只是一个类声明,因此需要在项目中添加QuartzCore框架
2. Quartz 2D是跨平台的,而UIKit只能使用在IOS系统中,因而如果需要使用颜色,不能直接使用UIColor,需要转换成CGColor。
CALayer具有以下基本属性,可以直接对layer的这些属性进行设值:
- bounds: 设置宽度和高度
- backgroundColor:背景颜色(CGColorRef类型)
- borderColor: 边框颜色(CGColorRef类型)
- borderWidth: 边框宽度
- cornerRadius: 圆角半径
- contents: 图层内容(CGImageRef)
- transform: 旋转,缩放,平移
- position: 位置
- anchorPoint
对CALayer设置阴影时,需要同时设置三个属性:shadowColor, shadowOffset和shadowOpacity。
1. 在对UIImageView的图层layer做操作时,因为UIImageView不止有一个图层,所以必须设定imageView图层的遮罩属性,这样告诉layer将位于它之下的图层都遮盖住,这样才会显示对layer做的改动:
[imageView.layer setMasksToBounds:YES];
但如果对此做了设置,那么图层的阴影效果就会消失,因为被mask图层被遮盖住了。
2. CALayer的形变是3D的,因此形变参数中需要对x,y,z轴设置。
平移:[imageView.layer setTransform:CATransform3DMakeTranslation(0, -100, 0); //往上平移100点
缩放:[imageView.layer setTransform:CATransform3DMakeScale(0.5, 1.0, 1.0); //x轴缩小
旋转:[imageView.layer setTransform:CATransform3DMakeRotation(M_PI_2, 0, 0, 1.0) //这里x, y, z轴的含义是使图像沿着哪个轴旋转,如果是沿着z轴旋转,那么就是在屏幕平面上旋转。
3. 通过以上的setTransform方法设置形变,一次只能设置一个形变效果,如果设置多个的话,后面的形变设置会覆盖之前的形变设置。可以用keypath来一次设置多个形变。可以在xcode文档中查找transform3d关键字来找到对应的所有的keypath.
平移:[imageView.layer setValue: @-100 forKeyPath:@"transform.translation.y"];
缩放:[imageView.layer setValue:@0.5 forKeyPath:@"transform.scale"];
旋转:[imageView.layer setValue:@M_PI_2 forKeyPath:@"transform.rotation.z"];
4. 使用方法addSublayer将子图层添加到视图的根图层里时,图层所加的位置默认为视图的中心点,需要用setPosition对子图层设置中心位置,才能添加到正确的位置。图层layer的anchor point的值范围x轴,y轴各是0-1,anchorpoint是相对于图层本身来说的,如果anchorpoint值为0.5, 0.5,则为图层的中心点,如果值为1, 1 则为图层的右下角。 anchorpoint决定了图层的位置和旋转效果。因为在添加子图层时,是把子图层的anchorpoint对应到之前设置的position位置,图层旋转也是绕着anchorpoint进行旋转。所以通过改变图层的anchorPoint可以动态改变图层的位置
Tip: 可以根据自图层的锚点来实现图片的显示和隐藏。
CALayer的隐式动画属性
所有的非根图层都有隐式动画,所谓的隐式动画就是当改变动画属性时,相应的修改会自动产生动画效果。能执行隐式动画的称为“可动画属性”,如:bounds, position, opacity。可以在xcode里查找CALayer Animatable Properties来查看所有的隐式动画属性。
例如在touchBegan里修改layer的position属性,当手指点击屏幕时,layer的位置就会发生改变,同时伴随动画效果。
CALayer绘图
要在CALayer上绘图,有两种方法:
1. 创建一个CALayer的子类,然后重写drawInContext:方法,可以使用Quartz2D API在其中进行绘图
用这种方式在CALayer上绘图的方法调用步骤为: 初始化UIView时,会自动调用UIView的代理方法drawLayer:inContext:(因为UIView默认是根视图的代理),然后这个方法会调用UIView的画图方法drawRect,如果drawRect方法里有绘图代码,先执行绘图代码最后执行子图层的drawInContext。因此UIView中drawRect里画的内容可能会被子图层的内容所覆盖。
2. 设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图
注意:
1. 不能再将UIView设置为这个CALayer的delegate,因为UIView对象默认已经是它所包含的根图层的代理,将它设置成自图层的代理会出错
2. 无论使用哪种方法,都必须向层发送setNeedsDisplay消息,以触发相应绘图方法的调用
CALayer、UIView以及上下文之间的关系
1. 当UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,然后向它的delegate即UIView,发送消息,并且传入已经准备好的CGContextRef对象。UIView在drawLayer:inContext:方法中会调用自己的drawRect:方法
2. 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由CALayer传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CALayer的CGContextRef中,然后被拷贝至屏幕
3. CALayer的CGContextRef用的是位图上下文(Bitmap Graphics Context)
相关推荐
在iOS开发中,CALayer是Core Animation框架的核心组成部分,它是一种轻量级的绘图对象,用于构建和管理UI元素的视觉表示。本教程通过"ios-CALayer.zip"压缩包,提供了一些基础的CALayer用法,帮助开发者更好地理解和...
#QCAR-CALayer 使用 Vuforia AR 引擎 使用不同的方法来显示 2D-AR 元素 QCARWebViewController 使用 UIWebView QCARCALayerViewController 使用 CALayer
在iOS开发中,CALayer是UI层的核心组件,它负责绘制和动画的实现。自定义CALayer能够让我们根据特定需求创建独特的视觉效果。本示例中的"ios-自定义CALayer.zip"是一个教学项目,旨在指导开发者如何通过自定义...
- 在iOS开发中,视图(UIView)通常与图层(CALayer)紧密相关,UIView负责处理触摸事件和用户交互,而CALayer负责视图的显示内容和动画。 - CALayer类似于UIView的容器,它也可以包含内容并管理子图层的位置。 -...
`CALayer`是Core Animation框架中的核心组件,它是iOS、macOS等Apple平台上视图的基础。`CALayer`不仅用于绘制图形,还能实现复杂的动画效果。在这个“swift-基于CALayer写的动画分类”项目中,我们将探讨如何利用`...
Swift-WBLoadingIndicatorView 是一个专门用于iOS应用中的加载等待动画的开源项目,它由Swift语言编写,并且基于Core Animation的CALayer进行封装。在iOS应用中,加载等待动画经常被用于表示数据加载过程,提升用户...
在Swift编程中,`CALayer`是Core Animation框架的核心组件,用于构建和管理视图的图形内容。通过使用`CALayer`,我们可以实现更高效、更灵活的动画和视觉效果。本教程将深入探讨如何利用`CALayer`来创建一个动态的...
UI相关面试题.pdf Runtime面试题.pdf Runloop面试题.pdf OC底层面试题.pdf Block面试题.pdf Animation面试题.pdf ...面试题--CALayer 与 UIView 的关系.pdf 流媒体知识核心概念 多线程面试题.pdf
然而,对于`CALayer`对象,它们并不直接支持AutoLayout。但通过一些技巧,我们可以让`CALayer`也能享受到类似AutoLayout的功能。本篇文章将探讨两种优雅地实现`CALayer` AutoLayout的方法。 方法一:使用...
《深入理解CALayer用户交互:源码解析》 在iOS开发中,我们经常与图形界面打交道,而CALayer是苹果提供的一个核心图形层类,它为视图(UIView)提供了丰富的视觉效果和高效的渲染能力。然而,对于CALayer的用户交互...
**CALayer基础知识** 在iOS开发中,`CALayer`是苹果的核心动画框架(Core Animation)中的基础类,它负责在屏幕上绘制和管理视图的内容。`UIView`实际上是由一个`CALayer`对象支持的,视图的大部分视觉效果都是通过...
ForAnimationCALayer的各种动画效果IntroduceIOS--CALayer实现,界限、透明度、位置、旋转、缩放组合动画基于框架:QuartzCore.framework//抖动CABasicAnimation* shake = [CABasicAnimation animationWithKeyPath:@...
在iOS和macOS开发中,`CALayer`是Core Animation框架的核心组成部分,它是一个轻量级的对象,用于绘制和管理视觉元素。`CALayer`不仅仅是一个绘图对象,还提供了丰富的动画功能,使得开发者能够创建出流畅、高性能的...
在iOS开发中,CALayer是Core Animation框架的核心组件,它负责在屏幕上绘制和动画化视觉内容。`CALayer`是一个轻量级的对象,用于管理视图的几何形状、内容、透明度以及各种视觉效果。本篇文章将深入探讨`CALayer`的...
Swift-VBPieChart是一款专为iOS应用设计的、基于CALayer的饼图控件,它提供了丰富的动画效果和自定义选项。在这个项目中,开发者可以轻松地在应用程序中集成动态且美观的饼图,以便更好地展示数据分布。下面将详细...
**CALayer基本使用** 在iOS开发中,CALayer是苹果提供的一个核心图形层类,它负责绘制和动画处理。CALayer是UIKit框架的基础,几乎所有的视图(UIView)都有一个对应的CALayer。理解并熟练使用CALayer对于优化性能...
在iOS开发中,CAlayer是UIKit框架中的核心部分,它是UI视图的基础,负责处理图形渲染和动画。本文将深入探讨CAlayer的两个关键属性:`position`和`anchorPoint`,以及如何利用它们来调整视图的布局和动画效果。同时...
在iOS和macOS开发中,Core Animation是苹果提供的一个强大的动画和图形框架,它底层的基础元素就是`CALayer`。`CALayer`是苹果UI渲染的核心,它负责管理视图的绘制、动画以及与硬件的交互。本篇将深入探讨`CALayer`...
在iOS和macOS开发中,`CALayer`是Core Animation框架的核心组成部分,它负责图形的渲染和动画。`CALayer`对象是不透明的矩形区域,可以包含内容、边框、阴影等视觉元素,是构建用户界面的基础。这篇内容我们将深入...
资深大牛全方位剖析: UI相关 Runtime Runloop OC底层 Block Animation 音视频学习从零到整(2) 音视频学习从零到整(1) 性能优化 ...探讨iOS 中图片的解压缩...面试题--CALayer 与 UIView 的关系 流媒体知识核心概念 多线程