CGAffineTransform介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGAffineTransform介绍相关的知识,希望对你有一定的参考价值。

参考技术A ios CGAffineTransform你了解多少?

CGAffineTransform介绍

概述

CGAffineTransform是一个用于处理形变的类,其可以改变控件的平移、缩放、旋转等,其坐标系统采用的是二维坐标系,即向右为x轴正方向,向下为y轴正方向

在UIView中有一个transform属性便是专门用来控制形变的,其使用方法如下

样例素材

在介绍UIView形变的过程中,我们会使用一个UIImageView图片为例,对各动画效果进行演示

方法介绍

CGAffineTransformMakeTranslation实现以初始位置为基准,在x轴方向上平移x单位,在y轴方向上平移y单位

注: 当tx为正值时,会向x轴正方向平移,反之,则向x轴负方向平移;当ty为正值时,会向y轴正方向平移,反之,则向y轴负方向平移

CGAffineTransformMakeScale实现以初始位置为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍

注: 当sx为正值时,会在x轴方向上缩放x倍,反之,则在缩放的基础上沿着竖直线翻转;当sy为正值时,会在y轴方向上缩放y倍,反之,则在缩放的基础上沿着水平线翻转

CGAffineTransformMakeRotation实现以初始位置为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)

注1: 当angle为正值时,逆时针旋转坐标系统,反之顺时针旋转坐标系统

注2: 逆时针旋转坐标系统的表现形式为对控件进行顺时针旋转

CGAffineTransformTranslate实现以一个已经存在的形变为基准,在x轴方向上平移x单位,在y轴方向上平移y单位

CGAffineTransformScale实现以一个已经存在的形变为基准,在x轴方向上缩放x倍,在y轴方向上缩放y倍

CGAffineTransformRotate实现以一个已经存在的形变为基准,将坐标系统逆时针旋转angle弧度(弧度=π/180×角度,M_PI弧度代表180角度)

特殊地,transform属性默认值为CGAffineTransformIdentity,可以在形变之后设置该值以还原到最初状态

CGAffineTransform原理

CGAffineTransform形变是通过"仿射变换矩阵"来控制的,其中平移是矩阵相加,旋转与缩放则是矩阵相乘,为了合并矩阵运算中的加法和乘法,引入了齐次坐标的概念,它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法.CGAffineTransform形变就是把二维形变使用一个三维矩阵来表示,其中第三列总是(0,0,1),形变通过前两列来控制,系统提供了CGAffineTransformMake结构体来控制形变

该三维变换矩阵如下

通过变换矩阵左乘向量,将空间中的一个点集从一个坐标系变换到另一个坐标系中,计算方式如下

结果.png

由此可知,其中tx用来控制在x轴方向上的平移,ty用来控制在y轴方向上的平移;a用来控制在x轴方向上的缩放,d用来控制在y轴方向上的缩放;abcd共同控制旋转

平移CGAffineTransformMakeTranslation原理

缩放CGAffineTransformMakeScale原理

旋转CGAffineTransformMakeRotation原理

初始状态CGAffineTransformIdentity原理

使用 CGAffineTransform 的 UIView 旋转

【中文标题】使用 CGAffineTransform 的 UIView 旋转【英文标题】:UIView Rotation using CGAffineTransform 【发布时间】:2011-03-17 12:46:55 【问题描述】:

我想使用 CGAffineTransform 旋转 UIView,并且我能够使用 CGAffineTransform 旋转 View。

但我想基于滑动手势在手指触摸时平滑旋转 UIView。

因此,就像向右滑动、向左滑动一样,我能够检测到滑动,但是当我从下到右或从下到左滑动时,我无法检测到这些类型的滑动手势......

【问题讨论】:

我不知道为什么有人对这个问题投了反对票。请在您投反对票后发表评论。 @Robin:再次感谢.....我提醒一下...... 【参考方案1】:

Sanjay 这些是 iPhone 支持的唯一允许的手势

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html#//apple_ref/occ/instp/UISwipeGestureRecognizer/direction

所以我认为您正在尝试识别对角滑动手势并且它不起作用。

还有滑动手势所需的最少 numberOfTouchesRequired。

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html#//apple_ref/occ/cl/UISwipeGestureRecognizer

如果你想旋转一个 UIView 对象,我认为你会在这个链接中找到代码

rotating a view on touch

希望这会有所帮助。

【讨论】:

别提了,伙计......如果需要任何帮助,请评论我的任何问题或答案。我会尽力帮助你.......\

以上是关于CGAffineTransform介绍的主要内容,如果未能解决你的问题,请参考以下文章

Affinity Propagation聚类算法的实现

云原生之使用Docker部署Affine知识库工具

Affinity Propagation聚类算法的实现

CGAffineTransform:如何计算乘法 CGAffineTransform?

云原生之kubernetes实战在k8s环境下部署Affine知识库工具

使用 CGAffineTransform 的 UIView 旋转