iOS开发——CGAffineTransform 详解

1. 基本方法 :

1.1 位移 :

// 上移
self.img.transform = CGAffineTransformTranslate(self.img.transform,0, -20);
// 右移
self.img.transform = CGAffineTransformTranslate(self.img.transform, 20,0);

1.2 缩放 :

// 放大 1.2
self.img.transform = CGAffineTransformScale(self.img.transform,1.2,1.2);

1.3 旋转 :

// 逆时针 45°
self.img.transform = CGAffineTransformRotate(self.img.transform, -M_PI_4);


2.问题说明 :

 如果只按上下左右方向键,图片会沿着垂直水平方向移动  



当左旋45°之后,上移会沿着45°方向向上移动,不会沿着垂直方向上移



3.问题详解 :

3.1 CGAffineTransform结构

struct CGAffineTransform {
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};

实则为一个三阶矩阵 : 


矩阵最右列 [0 , 0 , 1] 是固定不变的常数值, 所以有用的信息就是前两列

其结果因变换矩阵的变量值而改变,下面公式是之前矩阵变换的简化 :



旋转后平移, iOS开放文档里总结以下公式 :



结论 : 

a表示x水平方向的缩放,tx表示x水平方向的偏移
d表示y垂直方向的缩放,ty表示y垂直方向的偏移
如果b和c不为零的话,那么视图肯定发生了旋转

3.2 水平垂直移动


使用CGAffineTransform旋转后基准坐标轴已经改变 , 如果希望依照标准坐标轴来移动 , 需要改变center来修改位置

将下面代码1改为代码2

代码1 :

    switch (btn. tag ) {
       
case 100 :
           
self . img . transform = CGAffineTransformTranslate ( self . img . transform , 0 , - 100 );
           
break ;
       
case 101 :
           
self . img . transform = CGAffineTransformTranslate ( self . img . transform , - 100 , 0 );
           
break ;
       
case 102 :
           
self . img . transform = CGAffineTransformTranslate ( self . img . transform , 0 , 100 );
           
break ;
       
case 103 :
           
self . img . transform = CGAffineTransformTranslate ( self . img . transform , 100 , 0 );
           
break ;
       
default :
           
break ;
    }

代码2 :

    CGPoint center = self . img . center ;

   
switch (btn. tag ) {
       
case 100 :
            center.
y -= 20 ;
           
break ;
       
case 101 :
            center.
x -= 20 ;
           
break ;
       
case 102 :
            center.
y += 20 ;
           
break ;
       
case 103 :
            center.
x += 20 ;
           
break ;
       
default :
           
break ;
    }
   
    self.img.center = center;



参考资料 :

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html
http://blog.csdn.net/dyllove98/article/details/9051139
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值