CGAffineTransform

    CGAffineTransform是一个结构体,在苹果的API中是这样定义的:

  struct CGAffineTransform {

   CGFloat a, b, c, d;

   CGFloat tx, ty;

 };

  其包含的六个元素加上第三列的[0 0 1]构成一个三行三列的矩阵在计算机里存储,最后一列用来作为坐标系的标准。所以所有的变化都由前两列完成。其矩阵形式为:

  |a  b  0|

  |c  d  0|

  |tx ty 1|

  计算机中所有的图像都是有一个个点构成的,所以,这些点发生变化就会使图片发生变化(比如位移,旋转,缩放),取一个点加以说明:比如说有一个点的坐标是(x,y);计算机会在把他先转化成[x y 1]这个矩阵,将这个矩阵与CGAffineTransform相乘就能得到变化后的坐标.计算结果如下:

              |a  b  0|

|x  y  1|   X|c  d  0| =|ax +cy +tx  bx +dy +ty 1|

              |tx ty 1|

  1.如果做的是位移操作:则会用到CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx, CGFloat ty)方法,如果你看到API的注释你会发现CGAffineTransform的六个成员变量值为a = d = 1 b = c = 0 tx,ty作为两个传进来的参数(新点的坐标).

//注释

/* Translate `t' by `(tx, ty)' and return the result:

     t' = [ 1 0 0 1 tx ty ] * t */

                |1  0  0|

   |x  y  1| X  |0  1  0| = |x + tx y + ty  1|

                   |tx ty 1| 

   即在原点的基础上x y 各加了tx, ty所以图像发生了位移

  2.如果做得是缩放操作:则会用到CGAffineTransform CGAffineTransformScale(CGAffineTransform t,

  CGFloat sx, CGFloat sy)方法,同样,我们查看API的注释,发现其六个变量变成了a = sx d = sy b = c =tx = ty = 0;其中sx和sy是比例系数

//注释

/* Scale `t' by `(sx, sy)' and return the result:

     t' = [ sx 0 0 sy 0 0 ] * t */

                |sx  0  0|

   |x  y  1| X  |0  sy  0| = |x*sx + y*sy  1|

                |0   0  1| 

  可以看到:得到的坐标是原坐标的x,y乘以比例系数后的,这样图像会发生缩放

  3.如果是旋转的话,则会用到CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,

  CGFloat angle)方法,这里的形参t为原点的坐标,angle为旋转的弧度计算机会把其算成角度在进项计算,同样,查看注释,我们会得到一个新的矩阵:

//注释

/* Rotate `t' by `angle' radians and return the result:

     t' =  [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */          

             
                |cos(angle)  sin(angle)   0|

   |x  y  1| X  |-sin(angle)  cos(angle)  0| = |x*cos(angle)-y*sin(angle) ysin(angle)+cos(angle)             

                |0              0         1|     1|                    
   通过这样的变化,可以使图像达到旋转的效果.

   下面用一个UIImageView进行说明:

//

//  MainViewController.m

//  UI_genture

//

//  Created by dlios on 15-1-22.

//  Copyright (c) 2015年 lanou3g.com 蓝鸥科技. All rights reserved.

//


#import "MainViewController.h"


#define ImageTag 101


@interface MainViewController ()


@property (nonatomic,retain)UIImageView *imageView;


@end


@implementation MainViewController


-(void)dealloc{

    [super dealloc];

}


- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {

        

    }

    return self;

}


- (void)viewDidLoad {

    [superviewDidLoad];

    [selfcreateButton];

    // Do any additional setup after loading the view.

}

- (void)createButton{

    self.imageView = [[UIImageViewalloc]initWithFrame:CGRectMake(50,100,100, 100)];

    [self.imageViewsetImage:[UIImageimageNamed:@"moutain.jpg"]];

    self.imageView.userInteractionEnabled =YES;

    [self.viewaddSubview:self.imageView];

    [_imageView release];

    

    

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"点击",@"长按",@"轻扫",@"捏合",@"旋转",@"拖拽",nil];

    UISegmentedControl *seg = [[UISegmentedControlalloc]initWithItems:array];

    [seg setFrame: CGRectMake(50,250,300, 50)];

    [seg addTarget:selfaction:@selector(segAction:)forControlEvents:UIControlEventValueChanged];

    [self.viewaddSubview:seg];

    

}


#pragma mark -

#pragma mark seg


- (void)segAction:(id)sender{

    UISegmentedControl *seg =(UISegmentedControl *)sender;

//    if (seg.selectedSegmentIndex == 0) {

//        

//    }

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    //移除imageView的所有手势,重新添加新的手势

    //第一步:获得一个视图的所有手势

    NSArray *gestures =self.imageView.gestureRecognizers;

    //移除

    for (UIGestureRecognizer *ges in gestures) {

        [self.imageViewremoveGestureRecognizer:ges];

    }

    

    

    switch (seg.selectedSegmentIndex) {

        case 0:

        {

            UITapGestureRecognizer *tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(gestureAction:)];

                [self.imageViewaddGestureRecognizer:tap];

            [taprelease];

        }

            break;

            

        case 1:

        {

            UILongPressGestureRecognizer *lon = [[UILongPressGestureRecognizeralloc]initWithTarget:selfaction:@selector(longAction:) ];

            [self.imageViewaddGestureRecognizer:lon];

            [lonrelease];

        }

            break;

        

        case 2:{

            UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(swipeAction:)];

            swipe.direction =UISwipeGestureRecognizerDirectionRight;

            [self.imageViewaddGestureRecognizer:swipe];

            [swiperelease];

        }

            break;

        

        case 3:{

            UIPinchGestureRecognizer *pin = [[UIPinchGestureRecognizeralloc]initWithTarget:selfaction:@selector(pinchAction:)];

            [self.viewaddGestureRecognizer:pin];

            [pinrelease];

        }

            break;

            

        case 4:{

            UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizeralloc]initWithTarget:selfaction:@selector(rotateAction:)];

            [self.imageViewaddGestureRecognizer:rotate];

            [rotaterelease];

        }

            break;

        case 5:{

            UIPanGestureRecognizer *pan = [[UIPanGestureRecognizeralloc]initWithTarget:selfaction:@selector(panAction:)];

            [self.imageViewaddGestureRecognizer:pan];

            [panrelease];

            

            

        }

            break;

            

        default:

            break;

    }

}


#pragma mark -

#pragma mark 点击手势时间


- (void)gestureAction:(UITapGestureRecognizer *)tap{

    //通过手势获得手势所在的视图

    UIImageView *aImage = (UIImageView *)tap.view;

    if (tap.state ==UIGestureRecognizerStateBegan) {

        NSLog(@"开始点击");

    }

    

    NSLog(@"%s",__func__);

    [self.imageViewsetImage:[UIImageimageNamed:@"1.jpg"]];

    

}

//旋转

- (void)rotateAction:(UIRotationGestureRecognizer *)ges{

    self.imageView.transform =CGAffineTransformRotate(self.imageView.transform, ges.rotation);//基础角度,以当前点的轴为主轴进行旋转

    

//    self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, 3.0);

//    ges.rotation = 0;//每旋转一次把基准点设为零

    NSLog(@"%f",ges.rotation);

}


- (void)longAction:(UILongPressGestureRecognizer *)lon{

    if (lon.state ==UIGestureRecognizerStateBegan) {

        NSLog(@"%s",__func__);

        NSLog(@"开始");

    }elseif (lon.state ==UIGestureRecognizerStateChanged)

    {NSLog(@"改变");

    }elseif (lon.state ==UIGestureRecognizerStateCancelled){

        NSLog(@"清理");

    }elseif(lon.state ==UIGestureRecognizerStateEnded){

        NSLog(@"结束");

    }

}


- (void)swipeAction:(UISwipeGestureRecognizer *)swipe{

    if(swipe.direction ==UISwipeGestureRecognizerDirectionRight){

            NSLog(@"向右移");

    }


}


- (void)pinchAction:(UIPinchGestureRecognizer *)pin{


    self.imageView.transform =CGAffineTransformScale(self.imageView.transform, pin.scale, pin.scale);

        NSLog(@"sacle = %f捏合",pin.scale);

    pin.scale =1.0f;

}



- (void)panAction:(UIPanGestureRecognizer *)pan{

    NSLog(@"拖拽");

    CGPoint point = [pan translationInView:self.imageView];

    self.imageView.transform =CGAffineTransformTranslate(self.imageView.transform, point.x, point.y);

    [pan setTranslation:CGPointZeroinView:self.imageView];

}

//



- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}





/*

#pragma mark - Navigation


// In a storyboard-based application, you will often want to do a little preparation before navigation

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    // Get the new view controller using [segue destinationViewController].

    // Pass the selected object to the new view controller.

}

*/


@end


原图:



  平移:

      



缩放:



旋转:


在旋转时截取旋转物体的旋转角度可以看到,旋转一周的弧度值为6,侧面反映出,在调用旋转函数时的传入参数是一个弧度值.




参考:http://baike.baidu.com/link?url=FZ3T7NJ5UmqX36NsWbh0ybuL6BkaIw6t0aHPM511qe24DzvxM_1-b5DaQ2VG4l4zYXyKyjN5dEY_J4OKlDMguK

参考:http://justsee.iteye.com/blog/1969933









             |1  0  0|

   |x  y  1| X  |0  1  0| = |x + tx y + ty  1|

             |tx ty 1| 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值