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|