iOS 仿射变换CGAffineTransform

iOS所有继承UIView的类都有一个CGAffineTransform类型的属性transform,它是定义在二维空间上完成View的平移,旋转,缩放等效果的实现。这篇文章主要是展示所有值变化的效果。

一:下面是原始的(默认的)transform
                      1(a)   0(b)   0
    
 仿射变换  transform:  0(c)   1(d)   0
    
                      0(tx)  0(ty)  1
    
          CGAffineTransformMake(a, b, c, d, tx, ty)
  默认值   CGAffineTransformMake(1, 0, 0, 1,  0,  0);
二:实战演示

1.原始值


self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 0);

2.修改a的值

self.contenView.transform = CGAffineTransformMake(2, 0, 0, 1, 0, 0);

3.修改b的值


self.contenView.transform = CGAffineTransformMake(1, 1, 0, 1, 0, 0);

4.修改c的值


self.contenView.transform = CGAffineTransformMake(1, 0, 1, 1, 0, 0);

5.修改d的值

self.contenView.transform = CGAffineTransformMake(1, 0, 0, 2, 0, 0);

6.修改tx的值

self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 100, 0);

7.修改ty的值


self.contenView.transform = CGAffineTransformMake(1, 0, 0, 1, 0, 100);

相信同学应该知道了它们每一个值的变化,这样就可以通过修改它们的值来完成你想要的动画效果。

三:下面是Apple整合的transform
  • 平移 :

①根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)

②根据本身的transform后者另外的transform进行平移CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)

  • 缩放 :

①根据本身的transform进行缩放

CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)

②根据本身的transform后者另外的transform进行缩放

CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)

  • 旋转 :

① 根据本身的transform进行旋转

CGAffineTransformMakeRotation(CGFloat angle) (angle 旋转的角度)

②根据本身的transform后者另外的transform进行旋转

CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)

  • 恢复 :反向旋转

CGAffineTransformInvert(CGAffineTransform t)

  • 合并:

CGAffineTransformConcat(CGAffineTransform t1,CGAffineTransform t2)
两个transform合并起来

  • 倾斜:

这个使我们自己定义

-(CGAffineTransform) CGAffineTransformMakeShear(CGFloat x,CGFloat y)

{   
CGAffineTransform transform = CGAffineTransformIdentity;

transform.c= -x;
transform.b= y;
returntransform;   
}
layer.affineTransform = CGAffineTransformMakeShear(1,0);
  • 评测:

查看是不是默认的transform
Bool CGAffineTransformIsIdentity(CGAffineTransform t)

比较两个transform是否相等
bool CGAffineTransformEqualToTransform(CGAffineTransform t1,CGAffineTransform t2)

仿射矩阵应用:

CGPointApplyAffineTransform(CGPoint point,CGAffineTransform t)得到新的中心CGPoint

CGSizeApplyAffineTransform(CGSize size,CGAffineTransform t) 得到新的size CGSize

CGRectApplyAffineTransform(CGRect rect,CGAffineTransform t) 得到新的rect CGRect

放射矩阵一个常用的情形就是根据用户的手势来相应的改变视图的变换

UIPanGestureRecognizer 位移

UIPinchGestureRecognizer 缩放

UIRotationGestureRecognizer 旋转

苹果官方的建议,要多次使用transform,最好是初始化一个CGAffineTransform,进行多次操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容