CGAffineTransform A structure for holding an affine transformation matrix. 包含如下参数: struct CGAffineTransform { CGFloat a; CGFloat b; CGFloat c; CGFloat d; CGFloat tx; CGFloat ty ; }; typedef struct CGAffineTransform CGAffineTransform; 下面直观的描述这个这个矩阵和坐标之间的关系。 originTransform = CGAffineTransformIdentity; 坐标变换之后出现的问题 意识到CGAffineTransform所做的变换其实是对坐标系做的变换。 -(void)editImageWithRotation:(UIRotationGestureRecognizer*)sender { CGAffineTransform transfrom
CGAffineTransform UIView的transform属性是一个CGAffineTransform类型,用于在二维空间做旋转,缩放和平移。 CGAffineTransform是一个可以和二维空间向量(例如CGPoint)做乘法的3X2的矩阵。称为仿射变换,“仿射”的意思是无论变换矩阵用什么值,图层中平行的两条线在变换之后任然保持平行”。 官方定义: struct CGAffineTransform { CGFloat a, b, c, d; CGFloat tx, ty; }; 虽然结构体中只有a,b,c,d,tx,ty /* 合并两个transform :t' = t1 * t2 */ CG_EXTERN CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2) CG_AVAILABLE_STARTING
第一个是CGAffineTransform,它描述了如何旋转,缩放或剪切路径或视图。第二个是奇偶填充(even-odd fills),它使我们可以控制应如何渲染重叠的形状。 这背后的数学方法相对简单,只有一个需要注意点:CGAffineTransform以弧度而非角度来度量角度。 0, to: CGFloat.pi * 2, by: CGFloat.pi / 8) { // 根据循环旋转当前的花瓣 let rotation = CGAffineTransform rotationAngle: number) // 将花瓣移到我们视野的中心 let position = rotation.concatenating(CGAffineTransform 译自Transforming shapes using CGAffineTransform and even-odd fills
二、使用CGAffineTransform相关函数进行绘制图形的几何变换 CGAffineTransform中定义的方法即意义列举如下: //创建标准的变换矩阵 CGAffineTransform (CGAffineTransform t, CGFloat tx, CGFloat ty); //对某个变换矩阵进行缩放变换 CGAffineTransform CGAffineTransformScale (CGAffineTransform t, CGFloat angle); //对某个变换矩阵进行翻转变换 CGAffineTransform CGAffineTransformInvert(CGAffineTransform t); //对两个变换矩阵进行计算 CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2); //比较两个变换矩阵是否相同 bool CGAffineTransformEqualToTransform(CGAffineTransform t1, CGAffineTransform t2
CGPathRef时会将得路径进行transform变换后返回 CGPathRef CGPathCreateCopyByTransformingPath(CGPathRef path, const CGAffineTransform /这个方法将创建矩形路径 第一个参数为要绘制的矩形区域 第2个参数为要进行的transform变换 CGPathRef CGPathCreateWithRect(CGRect rect,const CGAffineTransform * transform); //这个方法将创建椭圆形路径 CGPathRef CGPathCreateWithEllipseInRect(CGRect rect, const CGAffineTransform 三、CGPath的路径绘制相关方法 //将路径移动到一个点作为起点 void CGPathMoveToPoint(CGMutablePathRef path,const CGAffineTransform * m, CGRect rect); //向路径中追加一组矩形 void CGPathAddRects(CGMutablePathRef path, const CGAffineTransform *
= nil) { //设置一下重复动画平移的两个变换 var firstTransform: CGAffineTransform? = nil var lastTransform: CGAffineTransform? (translationX: offset, y: 0) lastTransform = CGAffineTransform(translationX: -offset, y: 0) case .vertical: firstTransform = CGAffineTransform(translationX: 0, y: offset) lastTransform = CGAffineTransform(translationX: 0, y: -offset) }
UIView setAnimationDuration: 0.25]; //-this will keep it in the same position - always standing up //CGAffineTransform M_PI / 0.5); //this will keep it standing up as in portrait however it will turn it upsidedown //CGAffineTransform //this will change the view to be upside-down but in proper alignment with the landscape mode //CGAffineTransform / 2.0); //this will change the view to be rightside-up in proper alignment with landscape mode CGAffineTransform move = CGAffineTransformMakeTranslation(0.0f, 0.0f); imageView.transform = move; CGAffineTransform
CGAffineTransform transform的类型是CGAffineTransform , 这是一个2D矩阵. 矩阵的基本知识 struct CGAffineTransform { CGFloat a, b, c, d; CGFloat tx, ty; }; CGAffineTransform CGAffineTransformMake CGAffineTransform CGAffineMakeTranslation(CGFloat tx,CGFloat ty) 第二种: 设b=c=tx=ty=0. [aX + cY + tx bX + dY + ty 1] = [aX dY 1]; 可见,这个时候,坐标X按照a进行缩放,Y按照d进行缩放,a,d就是X,Y的比例系数,其实这也就是函数 CGAffineTransform 其实这也就是函数 CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle) 的计算原理。angle即ɵ的弧度表示。
所以本篇博客就先将fang放射变换(CGAffineTransform)的东西拎出来单独的过一下,这样在下篇博客中就可以减少对仿射变换的介绍了。 之前的博客主要讲述了CATransition,而本篇博客主要聊的内容是CGAffineTransform。 一、平移 接下来我们来看一下CGAffineTransform的平移,在使用CGAffineTransform进行平移的时候,我们要注意坐标系的转换。 使用CGAffineTransform进行View的缩放也是比较简单的,下方就是对ImageView进行缩放的运行效果。在缩放的过程中分为x方向上的缩放和y方向的缩放。 三、旋转 接下来就来聊聊CGAffineTransform的旋转,直奔主题,下方就是旋转的运行结果。
那就写个就是了 基本思路就是让视图左右移动或者上下移动 调用视图的仿射变换函数就可以了吧 view.layer.setAffineTransform( CGAffineTransform(translationX switch direction { case .horizontal: self.layer.setAffineTransform(CGAffineTransform translationX: offset, y: 0)) case .vertical: self.layer.setAffineTransform(CGAffineTransform UIView.animate(withDuration: interval, animations: { self.layer.setAffineTransform(CGAffineTransform.identity
* Translate `t' by `(tx, ty)' and return the result: t' = [ 1 0 0 1 tx ty ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty) CG_AVAILABLE_STARTING(__MAC ; /* Scale `t' by `(sx, sy)' and return the result: t' = [ sx 0 0 sy 0 0 ] * t */ CG_EXTERN CGAffineTransform CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy) CG_AVAILABLE_STARTING(__MAC_10 CGAffineTransformRotate(CGAffineTransform t, CGFloat angle) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE
类型属性:animatedView.transform 一般是View的旋转,拉伸移动等属性,是二维的,通常使用都是前缀CGAffineTransform的类。 CGAffineTransform transform = CGAffineTransformScale(imageContainView.transform, 1.2, 1.2); [UIView 与CATransform3D 2.4.1 CGAffineTransform操作API CGAffineTransform结构体定义 struct CGAffineTransform { CGFloat CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t); 2.5 “组合动画” 与 CGAffineTransformConcat 另一种组合变换 基于已有的CGAffineTransform连续追加新的CGAffineTransform: CGAffineTransform transform = CGAffineTransformIdentity
有两个数据类型用来表示transform,分别是CGAffineTransform和CATransform3D。前者作用于UIView,后者为layer层次的变换类型。 对于想要了解矩阵变换是如何作用实现的,可以参考这篇博客:CGAffineTransform 放射变换 在开始使用transform实现你的动画之前,我先介绍几个常用的函数: /// 用来连接两个变换效果并返回 返回的t = t1 * t2 CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2) /// 矩阵初始值。 self.transform, sx, sy) CGAffineTransformMakeScale(CGFloat sx, CGFloat sy) CGAffineTransformScale(CGAffineTransform self.transform, tx, ty) CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty) CGAffineTransformTranslate(CGAffineTransform
CGAffineTransform(仿射变换)是作用于UIViews的2D操作,而CATransform3D是作用于CALayers的更复杂的3D操作,这两种变换可以转换。 经常会左右动画的效果 CATransform3D有着与CGAffineTrans类似的一组API,但他们有个重要的区别在于CATransform3D的效果只能加在layer的transform属性上,而CGAffineTransform 的转换 CGAffineTransform是UIKit框架中一个用于变换的矩阵,其作用与CATransform类似,只是其可以直接作用于View,而不用作用于layer,这两个矩阵也可以进行转换,方法如下 : //将一个CGAffinrTransform转化为CATransform3D CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t); 处理 3D 影像、制做互动立体旋转的效果 ?
5、CATransform3D与CGAffineTransform的转换 CGAffineTransform是UIKit框架中一个用于变换的矩阵,其作用与CATransform类似,只是其可以直接作用于 这两个矩阵也可以进行转换,方法如下: //将一个CGAffinrTransform转化为CATransform3D CATransform3D CATransform3DMakeAffineTransform (CGAffineTransform CATransform3D是否可以转换为CAAffineTransform bool CATransform3DIsAffine (CATransform3D t); //将CATransform3D转换为CGAffineTransform CGAffineTransform CATransform3DGetAffineTransform (CATransform3D t); 专注技术,热爱生活,交流技术,也做朋友。
UIFontDescriptor对象,并且设置变换参数 + (UIFontDescriptor *)fontDescriptorWithName:(NSString *)fontName matrix:(CGAffineTransform )matrix; CGAffineTransform是一个结构体,其用于文本的控件变换十分强大,在CoreAnimation框架中有CATransform3D这个结构体,CGAffineTransform 示例如下: //进行旋转 CGAffineTransform transfom = CGAffineTransformRotate(CGAffineTransformIdentity, instancetype)initWithFontAttributes:(NSDictionary<NSString *, id> *)attributes; 字典中可以配置的键值如下: //需要配置为NSValue值 CGAffineTransform
orientation 69 if orientation == UIDeviceOrientation.portraitUpsideDown { 70 ciImage = ciImage.applying(CGAffineTransform ))) 71 } 72 else if orientation == UIDeviceOrientation.portrait { 73 ciImage = ciImage.applying(CGAffineTransform 75 else if (orientation == UIDeviceOrientation.landscapeRight) { 76 ciImage = ciImage.applying(CGAffineTransform
说变形前我们来看看CGAffineTransform,CGAffineTransform为一个结构体: struct CGAffineTransform { CGFloat a, b, c, d 想进一步了解可以看这篇《iOS CGAffineTransform详解》 对iOS控件进行变形实际就是对控件transform属性进行操作。 CGAffineTransformMakeScale() CGAffineTransformMakeTranslate() CGAffineTransformMakeRotate() 这些API都是对设置CGAffineTransform imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // CGAffineTransform
再来看看方法: 向右移动300的仿射效果 CGAffineTransform translate = CGAffineTransformMakeTranslation(300, 0) 使用仿射基础方法 CGAffineTransform translate = CGAffineTransformMake(1,0,0,1,300,0) //CGAffineTransformMake(CGFloat a,
public func effectValue(size: CGSize) -> ProjectionTransform { return ProjectionTransform(CGAffineTransform 只需要知道:CGAffineTransform c 参数驱动倾斜,而 tx 则驱动 x 偏移。 func effectValue(size: CGSize) -> ProjectionTransform { return ProjectionTransform(CGAffineTransform -1 : 1) } return ProjectionTransform(CGAffineTransform(a: 1, b: 0, c: skew, d: 1, tx 0.01) let angle = calculateDirection(pt1, pt2) let transform = CGAffineTransform