CATransform3D

了解CATransform3D,请看这里 ##关键词 CATransform3D 旋转 缩放 平移 动画 矩阵 绘制 图层 转换 形变 本文所有示例代码或Demo可以在此获取:https://github.com/WillieWangWei/SampleCode_CATransform3D 如果本文对你有所帮助,请给个Star???? ##概述 CATransform3D是QuartzCore下声明的一个结构体,文档对它的描述: T... 阅读详情

iOS开发CoreAnimation解读——CATransform3D变换的应用

一、引言

        CATransform3D定义了一个变化矩阵,通过对矩阵参数的设置,我们可以改变layer的一些属性,这个属性的改变,可以产生动画的效果。首先,CATransform3D定义了一个4*4的矩阵,如下:

?
1
2
3
4
5
6
7
struct  CATransform3D
{
   CGFloat m11, m12, m13, m14;
   CGFloat m21, m22, m23, m24;
   CGFloat m31, m32, m33, m34;
   CGFloat m41, m42, m43, m44;
};

从m11到m44定义的含义如下:

m11:x轴方向进行缩放

m12:和m21一起决定z轴的旋转

m13:和m31一起决定y轴的旋转

m14:

m21:和m12一起决定z轴的旋转

m22:y轴方向进行缩放

m23:和m32一起决定x轴的旋转

m24:

m31:和m13一起决定y轴的旋转

m32:和m23一起决定x轴的旋转

m33:z轴方向进行缩放

m34:透视效果m34= -1/D,D越小,透视效果越明显,必须在有旋转效果的前提下,才会看到透视效果

m41:x轴方向进行平移

m42:y轴方向进行平移

m43:z轴方向进行平移

m44:初始为1

二、CATransform3D中的属性和方法

?
1
2
3
4
5
6
7
8
//初始化一个transform3D对象,不做任何变换
const  CATransform3D CATransform3DIdentity;
//判断一个transform3D对象是否是初始化的对象
bool  CATransform3DIsIdentity (CATransform3D t);
//比较两个transform3D对象是否相同
bool  CATransform3DEqualToTransform (CATransform3D a, CATransform3D b);
//将两个 transform3D对象变换属性进行叠加,返回一个新的transform3D对象
CATransform3D CATransform3DConcat (CATransform3D a, CATransform3D b);
1、平移变换
?
1
2
3
4
//返回一个平移变换的transform3D对象 tx,ty,tz对应x,y,z轴的平移
CATransform3D CATransform3DMakeTranslation (CGFloat tx, CGFloat ty, CGFloat tz);
//在某个transform3D变换的基础上进行平移变换,t是上一个transform3D,其他参数同上
CATransform3D CATransform3DTranslate (CATransform3D t, CGFloat tx, CGFloat ty, CGFloat tz);

例如:

?
1
2
3
4
5
6
7
8
9
     UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     imageView.image = [UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:imageView];
     
     UIImageView * newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     newImageView.image=[UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:newImageView];
     CATransform3D trans = CATransform3DMakeTranslation(10, 200, 0);
     newImageView.layer.transform =trans;

效果如下:

2、缩放变换
?
1
2
3
4
//x,y,z分别对应x轴,y轴,z轴的缩放比例
CATransform3D CATransform3DMakeScale (CGFloat sx, CGFloat sy, CGFloat sz);
//在一个transform3D变换的基础上进行缩放变换,其他参数同上
CATransform3D CATransform3DScale (CATransform3D t, CGFloat sx, CGFloat sy, CGFloat sz);

例如:

?
1
2
3
4
5
6
7
8
9
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     imageView.image = [UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:imageView];
     
     UIImageView * newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 100, 100)];
     newImageView.image=[UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:newImageView];
     CATransform3D trans = CATransform3DMakeScale(2, 1, 1);
     newImageView.layer.transform =trans;

效果如下:

3、旋转变换
?
1
2
3
4
5
6
//angle参数是旋转的角度,为弧度制 0-2π
//x,y,z决定了旋转围绕的中轴,取值为-1——1之间,例如(1,0,0),则是绕x轴旋转(0.5,0.5,0),则是绕x轴与y轴中
//间45度为轴旋转,依次进行计算
CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
//在一个transform3D的基础上进行旋转变换,其他参数如上
CATransform3D CATransform3DRotate (CATransform3D t, CGFloat angle, CGFloat x, CGFloat y, CGFloat z);

例如:

?
1
2
3
4
5
6
7
8
9
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     imageView.image = [UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:imageView];
     
     UIImageView * newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 100, 100)];
     newImageView.image=[UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:newImageView];
     CATransform3D trans = CATransform3DMakeRotation(M_PI/2, 0, 0, 1);
     newImageView.layer.transform =trans;

效果如下:

另外,当我们有垂直于z轴的旋转分量时,设置m34的值可以增加透视效果,也可以理解为景深效果,例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
     UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     imageView.image = [UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     imageView.layer.transform = CATransform3DMakeRotation(M_PI/4, 0, 1, 0);
     [self.view addSubview:imageView];
     
     UIImageView * newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 100, 100)];
     newImageView.image=[UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:newImageView];
     CATransform3D trans = CATransform3DIdentity;
     trans.m34 = -1/100.0;
     trans = CATransform3DRotate(trans, M_PI/4, 0, 1, 0);  
     newImageView.layer.transform =trans;

两个imageView都进行了y轴的旋转变换,第二个有透视效果,第一个没有,运行如下:

4、旋转翻转变换
?
1
2
//将一个旋转的效果进行翻转 
CATransform3D CATransform3DInvert (CATransform3D t);

例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
     UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
     imageView.image = [UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     imageView.layer.transform = CATransform3DMakeRotation(M_PI/4, 0, 0, 1);
     [self.view addSubview:imageView];
     
     UIImageView * newImageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 100, 100)];
     newImageView.image=[UIImage imageNamed:@ "屏幕快照 2015-12-06 下午3.27.15.png" ];
     [self.view addSubview:newImageView];
     CATransform3D trans = CATransform3DMakeRotation(M_PI/4, 0, 0, 1);
     trans = CATransform3DInvert(trans);
     
     newImageView.layer.transform =trans;

效果如下:

5、CATransform3D与CGAffineTransform的转换

        CGAffineTransform是UIKit框架中一个用于变换的矩阵,其作用与CATransform类似,只是其可以直接作用于View,而不用作用于layer,这两个矩阵也可以进行转换,方法如下:

?
1
2
3
4
5
6
//将一个CGAffinrTransform转化为CATransform3D
CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform m);
//判断一个CATransform3D是否可以转换为CAAffineTransform
bool  CATransform3DIsAffine (CATransform3D t);
//将CATransform3D转换为CGAffineTransform
CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t);
CATransform3D和CGAffineTransform之详细解说测试 1、本片博客重点在于两个类的解说,使用解说的不多。         3D 效果的基本类 CGAffineTransform ,还有他的兄弟CGAffineTransform类。这里对改两个类的方法等做了详细的测试和实验。 2、呼朋唤友 群的特点:   1、iOS 开发交流群,每周都有更新新的内容。   2、群里有3~5年的资深开发者。   3、群员在App开发过程中遇到什么问题,可 阅读详情

相关推荐

TransformDemo:iOS 3D CATransform3D演示

TransformDemo iOS 3D CATransform3D demo 透视设置 CATransform3D.m34=-1/D D越小 效果越明显 (m34 float) 设置m34后,旋转才有效

ios动画笔记(2)CATransform3D和CASpringAnimation 、CATransition和CAEmitterLayer、UIDynamicAnimator

用到了,经常忘记,记录一下几个例子 1、CATransform3D 主要能产生z轴翻转时的效果?记录下几个函数调用 (1)、CATransform3DIdentity 返回动画最初的状态,该矩阵没有缩放,旋转,歪斜,透视。该矩阵应用到图层上,就是设置默认值。 (2)、CATransform3D CATransform3DMakeRotation (CGFloat ang

likui1989的专栏 694

imageTransform3D.js

html5实现3D图片效果所用的js脚步文件imageTransform3D.js。html5实现3D图片效果所用的js脚步文件imageTransform3D.js。

CATransform3D 特效详解

关于图层的几个坐标系。 对于ios来说,坐标系的(0,0)点在左上角,就是越往下,Y值越大。越往右,X值越大。 一个图层的frame,它是position,bounds,anchorPoint和transform属性的一部分。 设置一个新的frame将会相应的改变图层的position和bounds,但是frame本身并没有保存。 position:是一个CGP

DDF的专栏 1231

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

TLSR8258蓝牙Mesh实战:从SDK下载到自定义通信指令全流程(附避坑指南)

本文详细介绍了TLSR8258蓝牙Mesh开发的完整流程,从SDK下载、环境搭建到自定义通信指令的实现。通过实战案例和避坑指南,帮助开发者快速掌握低功耗蓝牙Mesh网络构建技巧,适用于智能家居、工业监控等物联网场景。

weixin_29176179的博客 199

[iOS]学习笔记5(CATransform3D-Cube)

1. CATransform3D结构成员的意义。 struct CATransform3D { CGFloat m11(x缩放), m12(y切变), m13(旋转), m14(); CGFloat m21(x切变), m22(y缩放), m23(), m24(); CGFloat m31(旋转), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没...

weixin_30636089的博客 240

群晖Web Station实战:从零搭建个人静态导航站

本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。

tea88的博客 1330

CATransform3DRotate 实现3维立体效果

/ CATransform3DRotate 在X、Y、Z 轴上翻转 1表示变化 0不变。//CATransform3DTranslate 在X、Y、Z 轴上平移。

ForeverMyheart的博客 1238

python 中心线提取_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然OpenCV中常见的轮廓分析无法获得上面的中心红色线段,本质上这个问题是如何提取二值对象的骨架,提取骨架的方法在OpenCV的扩展模块中,另外skimage包也支持图像的骨架提取。这里就...

weixin_42204453的博客 4290

【Zephyr 系列 29】低功耗调试指南:电流测量、系统睡眠与功耗分析

Zephyr低功耗调试指南(150字摘要) 针对物联网设备续航需求,本文解析Zephyr低功耗调试方法:1️⃣ 机制:启用PM子系统和tickless idle,配置睡眠策略;2️⃣ 测量:推荐功耗分析仪捕捉μA级电流波动;3️⃣ 优化:管理唤醒源(如GPIO/RTC)、调整BLE广播/连接参数,挂起闲置外设;4️⃣ 分析:建立功耗文档,对比不同模式电流(如待机0.6mA vs广播3.2mA)。强调低功耗需系统性设计,初期即需纳入测试流程。下期将探讨Zephyr OTA升级实现。

hemoparrot的专栏 1180

IOS开发—CATransform3D介绍

最近项目中用到CATransform3D实现动画效果,感觉有点力不从心,对CALayer的一些属性模棱两可,故做了一番整理。首先要知道的几个概念:1、三维坐标系:视角垂直与屏幕而言,x轴向右,y轴向下,z轴垂直屏幕向外。 2、坐标系原点:ios默认以图层的左上角点为坐标原点,osx默认以图层左下角为坐标原点。注意是默认,因为图层的坐标原点是可以设置的,下面会介绍。3、view于layer的关系:对

Lotheve的私房菜 4052

SAP CPI 如何代理第三方接口?

代理接口是指在系统 A 和系统 B 之间引入一个中间层(如 SAP CPI),由中间层负责接收来自系统 A 的请求,进行必要的处理或转换,然后将请求转发给系统 B。由于 OData 服务通常使用 JSON 格式的数据,而某些内部系统可能需要 XML 格式,因此我们添加一个 JSON 到 XML 的转换器,以确保数据格式的兼容性。为了确保返回的数据格式符合内部系统的要求,添加一个 XML 到 JSON 的转换器,将 OData 服务的响应从 XML 转换为 JSON。在集成包中,添加一个新的集成流,命名为。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1748

CATransform3D 讲解

最近看到一个3D动画效果,决定认真就研究一下。从网上看到很多介绍,下面详细的讲解一下CATransform3D CATransform3D结构成员的意义。 structCATransform3D { CGFloat m11(x缩放), m12(y切变), m13(旋转), m14(); CGFloat m21(x切变), m22(y缩放), m23(), m24(); CG...

284

Codex 100个真实案例 - 用AI生成建筑平面图SVG(室内设计师的新武器)

本案例用 Codex 生成一套完整的 Python 脚本,自动绘制 SVG 格式的建筑平面图。我们会设计一个90平两室一厅的户型——客厅、主卧、次卧、厨房、卫生间一应俱全,还会自动摆放家具(沙发、床、餐桌、橱柜)、标注尺寸和面积、绘制水电路走向、生成多种配色方案。最终输出的 SVG 文件可以直接用浏览器打开展示,也可以转成 PNG 交给客户。室内设计师看了都说好!

yueyeguzhuo的专栏 761

PID、模糊PID、SkyHook、LQR、H2/H∞、ADRC等悬架控制合集

PID、模糊PID、SkyHook、LQR、H2/H∞等悬架控制合集

Mr.邹的博客 2013

iOS形变之CATransform3D

CATransform3D是一个用于处理3D形变的类,其可以改变控件的平移、缩放、旋转、斜交等,其坐标系统采用的是三维坐标系,即向右为x轴正方向,向下为y轴正方向,垂直屏幕向外为z轴正方向

蚊香酱的专栏 3842

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

iCarousel核心原理剖析:如何用CATransform3D实现3D旋转效果

iCarousel是一个简单、高度可定制的数据驱动3D旋转木马库,专为iOS和Mac OS设计。它通过CATransform3D变换实现了多种炫酷的3D效果,让开发者能够轻松创建出令人印象深刻的轮播界面。本文将深入探讨iCarousel如何利用CATransform3D实现各种3D旋转效果,帮助你理解其核心实现原理。 ## 🔍 iCarousel的核心架构 iCarousel基于UIKit框

gitblog_01172的博客 904

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

CATransform3D-Cube

原文已找不到 1. CATransform3D结构成员的意义。 ? structCATransform3D { CGFloat m11(x缩放), m12(y切变), m13(旋转), m14(); CGFloat m21(x切变), m22(y缩放), m23(), m24(); CGFloat m

volcan1987的专栏 2774

[iOS]CATransform3D

原文地址:http://www.cnblogs.com/healerkx/archive/2012/01/09/2317579.html 1. CATransform3D结构成员的意义。 ? struct CATransform3D { CGFloat m11(x缩放), m12(y切变), m13(旋转), m14();

Developer ——『WUBO专栏』 3889

CATransform3D的一点记录

做动画时经常要用到CATransform3D,这里记录一些自己的理解,一边日后尝尝温故。 CATransform3D.h中我们找到CATransform3D的结构定义: struct CATransform3D { CGFloat m11, m12, m13, m14; CGFloat m21, m22, m23, m24; CGFloat m31, m32, m33, m34;

香克斯的博客 1293

CATransform3D动画实例

在项目中,经常要做动画效果,比如wo

Apple_0611的专栏 722
上一篇: iOS下的实际网络连接状态检测
下一篇: Xcode连接git@osc
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值