时间:2021-05-20
什么是CALayer
* 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。
* 其实UIView之所以能显示在屏幕上,完全是因为它内部的一个层。
* 在创建UIView对象时,UIView内部会自动创建一个层(即CALayer对象),通过UIView的layer属性可以访问这个层。当UIView需要显示到屏幕上时,会调用 drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。
* 换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能。
引言
不知你是否遇到过将CALayer旋转360度的需求,如果有的话,你也许会尝试使用transform做旋转动画,然后发现。。。CALayer根本就不动。本文将深入解释并解决这个问题。
transform.rotation
CABasicAnimation支持transform.rotation这个keyPath,你可以将这个值从0改变到2pi进行动画。transform.rotation是绕z轴旋转。当然你也可以指定绕哪个轴旋转,比如x轴就是transform.rotation.x。这个可动画属性能够完美的实现旋转360度的需求。那么问题来了,既然它可以,为什么我这么写就不可以呢?我也是从0度的transform到360度的transform呀。
CATransform3D start = CATransform3DMakeRotation(0 * M_PI / 180.0, 0, 0, 1);CATransform3D end = CATransform3DMakeRotation(2 * M_PI / 180.0, 0, 0, 1);CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform"];animation.fromValue = [NSValue valueWithCATransform3D:start];animation.toValue = [NSValue valueWithCATransform3D:end];animation.duration = 3.3;动画插值
我们知道动画要想平滑,就得在我们给的from和to之间进行插值然后渲染这些插值情况下的帧。那么这些值是怎么插的呢?我们可以自定义一个Animatable的属性看看。下面是自定义Animatable的rotateX属性需要的代码。
@implementation HTCardLayer- (void)setRotateX:(CGFloat)rotateX { _rotateX = rotateX; CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}- (void)display { CGFloat rotateX = [(HTCardLayer *)self.presentationLayer rotateX]; NSLog(@"%lf", rotateX); CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}+ (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"rotateX"]) { return YES; } return [super needsDisplayForKey:key];}@endneedsDisplayForKey告诉系统rotateX修改后需要刷新显示,display则负责刷新显示,因为被动画的属性值都在presentationLayer中,所以我们从presentationLayer中取rotateX的最新值。下面是动画过程中打印出来的rotateX的值。基本就是一个线性的变化过程,因为我没有设置任何时间函数。rotateX是一个CGFloat,那如果是CATransform3D呢?会怎么变化?
0.3520710.7301801.1011041.4779821.8334672.1893242.5505812.9156823.2732143.6493894.0134204.3766634.7409995.1136405.4838365.8615156.234217CATransform3D的插值
我新增了一个Animatable的属性customMatrix来查看CATransform3D类型的属性是如何插值的。CATransform3D其实是一个4x4的矩阵。
- (void)display { CGFloat rotateX = [(HTCardLayer *)self.presentationLayer rotateX]; CATransform3D customMatrix = [(HTCardLayer *)self.presentationLayer customMatrix];// NSLog(@"%lf", rotateX); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m11, customMatrix.m12, customMatrix.m13, customMatrix.m14); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m21, customMatrix.m22, customMatrix.m23, customMatrix.m24); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m31, customMatrix.m32, customMatrix.m33, customMatrix.m34); NSLog(@"%lf, %lf, %lf, %lf", customMatrix.m41, customMatrix.m42, customMatrix.m43, customMatrix.m44); NSLog(@"---------"); CATransform3D transform = CATransform3DIdentity; transform.m34 = 1.0 / -300.0; self.transform = CATransform3DRotate(transform, rotateX, 1, 0, 0);}+ (BOOL)needsDisplayForKey:(NSString *)key { if ([key isEqualToString:@"rotateX"]) { return YES; } if ([key isEqualToString:@"customMatrix"]) { return YES; } return [super needsDisplayForKey:key];}下面是部分数据,我用的是绕z轴旋转的矩阵,所以只有m11,m12,m21,m22有数据,其他都是Identity矩阵的基本数值。可以看出m11,m12,m21,m22也是各自呈线性变化。
0.982547, -0.186012, 0.000000, 0.0000000.186012, 0.982547, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.930553, -0.366158, 0.000000, 0.0000000.366158, 0.930553, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.830170, -0.557510, 0.000000, 0.0000000.557510, 0.830170, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.700345, -0.713804, 0.000000, 0.0000000.713804, 0.700345, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.560556, -0.828117, 0.000000, 0.0000000.828117, 0.560556, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.403126, -0.915145, 0.000000, 0.0000000.915145, 0.403126, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.221203, -0.975228, 0.000000, 0.0000000.975228, 0.221203, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------0.030679, -0.999529, 0.000000, 0.0000000.999529, 0.030679, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.158010, -0.987438, 0.000000, 0.0000000.987438, -0.158010, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.347984, -0.937500, 0.000000, 0.0000000.937500, -0.347984, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.517222, -0.855851, 0.000000, 0.0000000.855851, -0.517222, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.672144, -0.740421, 0.000000, 0.0000000.740421, -0.672144, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.812617, -0.582798, 0.000000, 0.0000000.582798, -0.812617, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.905049, -0.425307, 0.000000, 0.0000000.425307, -0.905049, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.969663, -0.244444, 0.000000, 0.0000000.244444, -0.969663, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000----------0.998409, -0.056390, 0.000000, 0.0000000.056390, -0.998409, 0.000000, 0.0000000.000000, 0.000000, 1.000000, 0.0000000.000000, 0.000000, 0.000000, 1.000000---------这也就解释了为什么0到360度的动画直接不执行了,因为0和360度的矩阵一模一样,也就无法计算出任何插值。
总结
总而言之,如果你想360度旋转CALayer,要么使用transform.rotation,要么就自定义Animatable的属性。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
淘宝主图360度旋转怎么操作?流程是什么?现在淘宝展示产品的方式多样化,出了一个淘宝主图360度旋转的展示方法,那么这个淘宝主图360度旋转怎么操作?流程是
IOS中CALayer绘制图片的实例详解CALayer渲染内容图层。与UIImageView相比,不具有事件响应功能,且UIImageView是管理内容。注意事
本文实例为大家分享了利用CSS3实现登陆面板3D旋转起来的具体代码,供大家参考,具体内容如下效果图:点击登陆,登陆面板会发生360度旋转,并显示信息。旋转结束:
用CATIA软件绘制球体的剖面图,其实就是用旋转命令绘制不同的圆,只是旋转的角度不是360度,而是270度和90度。1、双击打开CATIA软件,新建一个PART
本文使用Matrix实现Android实现图片缩放与旋转。示例代码如下:复制代码代码如下:packagecom.android.matrix;importand