iOS 仿射变换CGAffineTransform

作者: 木马不在转 | 来源:发表于2018-01-19 11:49 被阅读373次

    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,进行多次操作。

    相关文章

      网友评论

        本文标题:iOS 仿射变换CGAffineTransform

        本文链接:https://www.haomeiwen.com/subject/cpkooxtx.html