cgaffinetransform3disidentity怎么用

矩阵乘法A B相乘要A的列数等于B的行数才有定义,结果是一个 A行B列的矩阵C,C的每个元素值为A对应的行与B对应的列的元素乘积的和具体看这里原理CGAffineTransformCGAffineTransform 的结构如下struct CGAffineTransform {
CGF};typedef struct CGAffineTransform CGAffineT&它其实表示的是一个矩阵&&因为最后一列总是是(0,0,1),所以有用的信息就是前面两列对一个view进行仿射变化就相当于对view上的每个点做一个乘法结果就是&基本上就是如果不看c和b的话a表示x水平方向的缩放,tx表示x水平方向的偏移d表示y垂直方向的缩放,ty表示y垂直方向的偏移如果b和c不为零的话,那么视图肯定发生了旋转从上面的式子也可以看出,仿射变化是不会对视图的基本形状发生该表的(矩形还是矩形,不会变成平行四边形,梯形)常量CGAffineTransformIdentityconst CGAffineTransformCGAffineTransformI&这个就是没有变化的最初的样子&创建一个仿射矩阵CGAffineTransformMake 直接赋值来创建CGAffineTransformMakeRotation 设置角度来生成矩阵结果就是CGAffineTransformMakeScale& 设置缩放,及改变a、d的值CGAffineTransformMakeTranslation& 设置偏移改变已经存在的放射矩阵CGAffineTransformTranslate& 原始的基础上加上偏移CGAffineTransformScale加上缩放CGAffineTransformRotate加上旋转CGAffineTransformInvert 反向的仿射矩阵比如(x,y)通过矩阵t得到了(x',y')那么通过这个函数生成的t'作用与(x',y')就能得到原始的(x,y)CGAffineTransformConcat 通过两个已经存在的放射矩阵生成一个新的矩阵t' = t1 * t2应用仿射矩阵CGPointApplyAffineTransform 得到新的点CGSizeApplyAffineTransform& 得到新的sizeCGRectApplyAffineTransform& 得到新的rect评测矩阵CGAffineTransformIsIdentity& 是否是CGAffineTransformIsIdentityCGAffineTransformEqualToTransform 看两个矩阵是否相等&应用放射矩阵一个常用的情形就是根据用户的手势来相应的改变视图的变换UIPanGestureRecognizer& 对应位移UIPinchGestureRecognizer& 对应缩放UIRotationGestureRecognizer 对应旋转通常如果需要看到实时的手指移动视图就相应的变换的技巧就是,每次接收到对应的gesture时间就相应的改变view的transform,然后吧这个gesture对应的translation、scale、rotation置为初始值。iOS开发UI篇—transframe属性(形变) - 文顶顶 - 博客园
iOS开发UI篇&transframe属性(形变)
1. transform属性
在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度
常用的创建transform结构体方法分两大类
(1) 创建&基于控件初始位置&的形变
CGAffineTransformMakeTranslation(平移)
CGAffineTransformMakeScale(缩放)
CGAffineTransformMakeRotation(旋转)
(2) 创建&基于transform参数&的形变
CGAffineTransformTranslate
CGAffineTransformScale
CGAffineTransformRotate
在OC中,所有跟角度相关的数值,都是弧度值,180& = M_PI
正数表示顺时针旋转
负数表示逆时针旋转
提示:由于transform属性可以基于控件的上一次的状态进行叠加形变,例如,先旋转再平移。因此在实际动画开发中,当涉及位置、尺寸形变效果时,大多修改控件的transform属性,而不是frame、bounds、center 。
2.代码示例
YYViewController.m
01-练习使用按钮的frame和center属性
Created by apple on 14-5-21.
Copyright (c) 2014年 itcase. All rights reserved.
9 #import "YYViewController.h"
11 //私有扩展
12 @interface YYViewController ()
14 @property(nonatomic,weak)IBOutlet UIButton *headImageV
17 @implementation YYViewController
19 //枚举类型,从1开始
20 //枚举类型有一个很大的作用,就是用来代替程序中的魔法数字
21 typedef enum
ktopbtntag=1,
kdownbtntag,
krightbtntag,
kleftbtntag
29 //viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作
30 - (void)viewDidLoad
//在viewDidLoad方法中,不要忘记调用父类的方法实现
[super viewDidLoad];
//手写控件代码
//一、写一个按钮控件,上面有一张图片
//1.使用类创建一个按钮对象
// UIButton *headbtn=[[UIButton alloc] initWithFrame:CGRectMake(100 ,100, 100, 100)];
//设置按钮对象为自定义型
UIButton *headbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置对象的各项属性
//(1)位置等通用属性设置
headbtn.frame=CGRectMake(100, 100, 100, 100);
//(2)设置普通状态下按钮的属性
[headbtn setBackgroundImage:[UIImage imageNamed:@"i"] forState:UIControlStateNormal];
[headbtn setTitle:@"点我!" forState:UIControlStateNormal];
[headbtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
//(3)设置高亮状态下按钮的属性
[headbtn setBackgroundImage:[UIImage imageNamed:@"a"] forState:UIControlStateHighlighted];
[headbtn setTitle:@"还行吧~" forState:UIControlStateHighlighted];
[headbtn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
//3.把对象添加到视图中展现出来
[self.view addSubview:headbtn];
//注意点!
self.headImageView=
//二、写四个控制图片左右上下移动方向的按钮控件
/**================向上的按钮=====================*/
//1.创建按钮对象
UIButton *topbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置对象的属性
topbtn.frame=CGRectMake(100, 250, 40, 40);
[topbtn setBackgroundImage:[UIImage imageNamed:@"top_normal"] forState:UIControlStateNormal];
[topbtn setBackgroundImage:[UIImage imageNamed:@"top_highlighted"] forState:UIControlStateHighlighted];
[topbtn setTag:1];
//3.把控件添加到视图中
[self.view addSubview:topbtn];
//4.按钮的单击控制事件
[topbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
/**================向下的按钮=====================*/
//1.创建按钮对象
UIButton *downbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置对象的属性
downbtn.frame=CGRectMake(100, 350, 40, 40);
[downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_normal"] forState:UIControlStateNormal];
[downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_highlighted"] forState:UIControlStateHighlighted];
[downbtn setTag:2];
//3.把控件添加到视图中
[self.view addSubview:downbtn];
//4.按钮的单击控制事件
[downbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
/**================向左的按钮=====================*/
//1.创建按钮对象
UIButton *leftbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置对象的属性
leftbtn.frame=CGRectMake(50, 300, 40, 40);
[leftbtn setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal];
[leftbtn setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted];
[leftbtn setTag:4];
//3.把控件添加到视图中
[self.view addSubview:leftbtn];
//4.按钮的单击控制事件
[leftbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
/**================向右的按钮=====================*/
//1.创建按钮对象
UIButton *rightbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置对象的属性
rightbtn.frame=CGRectMake(150, 300, 40, 40);
[rightbtn setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];
[rightbtn setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];
[rightbtn setTag:3];
//3.把控件添加到视图中
[self.view addSubview:rightbtn];
//4.按钮的单击控制事件
[rightbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
//三、写两个缩放按钮
/**================放大的按钮=====================*/
//1.创建对象
UIButton *plusbtn=[UIButton buttonWithType:UIButtonTypeCustom];
//2.设置属性
plusbtn.frame=CGRectMake(75, 400, 40, 40);
[plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_normal"] forState:UIControlStateNormal];
[plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_highlighted"] forState:UIControlStateHighlighted];
[plusbtn setTag:1];
//3.添加到视图
[self.view addSubview:plusbtn];
//4.单击事件
[plusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];
/**================缩小的按钮=====================*/
UIButton *minusbtn=[UIButton buttonWithType:UIButtonTypeCustom];
minusbtn.frame=CGRectMake(125, 400, 40, 40);
[minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_normal"] forState:UIControlStateNormal];
[minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_highlighted"] forState:UIControlStateHighlighted];
[minusbtn setTag:0];
[self.view addSubview:minusbtn];
[minusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];
/**================向左旋转按钮=====================*/
UIButton *leftrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];
[leftrotatebtn setFrame:CGRectMake(175, 400, 40, 40)];
[leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_normal"] forState:UIControlStateNormal];
[leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_highlighted"] forState:UIControlStateHighlighted];
[leftrotatebtn setTag:1];
[self.view addSubview:leftrotatebtn];
[leftrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];
/**================向右旋转按钮=====================*/
UIButton *rightrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];
[rightrotatebtn setFrame:CGRectMake(225, 400, 40, 40)];
[rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_normal"] forState:UIControlStateNormal];
[rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_highlighted"] forState:UIControlStateHighlighted];
[rightbtn setTag:0];
[self.view addSubview:rightrotatebtn];
[rightrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];
172 //控制方向的多个按钮调用同一个方法
173 -(void)Click:(UIButton *)button
//练习使用frame属性
//CGRect frame=self.headImageView.
/**注意,这里如果控制位置的两个属性frame和center同时使用的话,会出现很好玩的效果,注意分析*/
//练习使用center属性
CGPoint center=self.headImageView.
switch (button.tag) {
case ktopbtntag:
center.y-=30;
case kdownbtntag:
center.y+=30;
case kleftbtntag:
//发现一个bug,之前的问题是因为少写了break,造成了它们的顺序执行,sorry
//center.x=center.x-30;
center.x-=50;
case krightbtntag:
center.x+=50;
self.headImageView.frame=
//首尾式设置动画效果
[UIView beginAnimations:nil context:nil];
self.headImageView.center=
//设置时间
[UIView setAnimationDuration:2.0];
[UIView commitAnimations];
NSLog(@"移动!");
210 -(void)Zoom:(UIButton *)btn
//使用bounds,以中心点位原点进行缩放
CGRect bounds = self.headImageView.
if (btn.tag) {
bounds.size.height+=30;
bounds.size.width+=30;
bounds.size.height-=50;
bounds.size.width-=50;
//设置首尾动画
[UIView beginAnimations:nil context:nil];
self.headImageView.bounds=
[UIView setAnimationDuration:2.0];
[UIView commitAnimations];
231 -(void)Rotate:(UIButton *)rotate
//位移(不累加)
//self.headImageView.transform=CGAffineTransformMakeTranslation(50, 200);
//self.headImageView.transform=CGAffineTransformMakeScale(1.2, 10);
//在原有的基础上位移(是累加的)
//self.headImageView.transform=CGAffineTransformTranslate(self.headImageView.transform, 50, 50);
//在原有的基础上进行缩放
//self.headImageView.transform=CGAffineTransformScale(self.headImageView.transform, 1.5, 1.6);
//在原有的基础上进行旋转
if (rotate.tag) {
//旋转角度为1/pi,逆时针
self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
//旋转的角度为pi/2,顺时针
self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, M_PI_2);
实现效果:
3.viewDidLoad
viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作
在viewDidLoad方法中,一定不要忘记调用父类的方法实现
[super viewDidLoad];
随笔 - 161
评论 - 811CGAffineTransform今天碰到了一个旋转放缩图片的一个demo,在看的过程中发现实现图片变化的那个方法特别简单。一共只有三句话,下面就是这个方法- (void)transformImageView{CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,scale * previousScale);t = CGAffineTransformRotate(t, rotation + previousRotation);self.imageView.transform =}来说一下这个方法的内容1、首先创建了一个变换CGAffineTransform的一个对象 t (至于CGAffineTransform是什么咱们后面会详细说),这个变换是用来放缩的,里面的两个参数分别是对宽和高放大或缩小的倍数,这里是以相同比例放缩的。2、第二行句是在放缩变化中再加入角度的变换。&3、最后把变换赋给图片视图的一个属性transform。就这么简单就实现了图片的旋转和放缩。当然这里面最让人头大的就是CGAffineTransform,为此我特地翻了一下文档CGAffineTransform首先我查到的这个类其实就是一个变换,一个3*3矩阵的变换&结果就是CGAffineTransform类的方法一、创建一个Transformations1、CGAffineTransformMake //直接创建变换CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty );可以看到参数比较多,其实它就是对应矩阵的前两列。据我估计,可能一般不会直接用这个做变换。2、CGAffineTransformMakeScale //创建一个给定比例放缩的变换CGAffineTransform CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);可以看到这个参数就少多了,也比较好理解,假设是一个图片视图引用了这个变换,那么图片的宽度就会变为 width*sx ,对应高度变为 hight * sy。3、CGAffineTransformMakeRotation //创建一个旋转角度的变化CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle);在这里可以看到参数并不是一个角度,但是它是把参数作为一个弧度,然后把弧度再转换为角度来处理,其结果就可能是将一个图片视图旋转了多少度。4、CGAffineTransformMakeTranslation //创建一个平移的变化CGAffineTransform CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);这个就比较好理解了,假设是一个视图,那么它的起始位置 x 会加上tx , y 会加上 ty二、修改Transformations1、CGAffineTransformTranslate //为一个变换再加上平移CGAffineTransform CGAffineTransformTranslate (CGAffineTransform t,CGFloat tx,CGFloat ty);简单来说就是在变化 t 上在加上平移2、CGAffineTransformScale //为一个Transformation再加上缩放CGAffineTransform CGAffineTransformScale (CGAffineTransform t,CGFloat sx,CGFloat sy);3、CGAffineTransformRotate //为一个Transformation再加上旋转CGAffineTransform CGAffineTransformRotate (CGAffineTransform t,CGFloat angle);4、CGAffineTransformInvert //返回Transformation的反向CGAffineTransform CGAffineTransformInvert (CGAffineTransform t);5、CGAffineTransformConcat //合并两个TransformationCGAffineTransform CGAffineTransformConcat (CGAffineTransform t1, CGAffineTransform t2);返回一个由 t1 和 t2 合并而成的Transformation三、运用Transformations1、CGPointApplyAffineTransform //把变化应用到一个点上CGPoint CGPointApplyAffineTransform (CGPoint point,CGAffineTransform t );这个方法的返回值还是一个CGPoint,在我看来由于是一个点,这个方法最终也只会影响这个点所在的位置。2、CGSizeApplyAffineTransform //运用到一个区域中CGSize CGSizeApplyAffineTransform (CGSize size,CGAffineTransform t);只会改变区域的大小3、CGRectApplyAffineTransform //运用到一个带原点的区间CGRect CGRectApplyAffineTransform (CGRect rect,CGAffineTransform t);这个我亲自试验过,三个属性 放缩、旋转和平移都有的一个Transformation ,但处理之后只会改变这个区域原点的位置,和宽、高的大小,并不会旋转四、检测一个Transformation1、CGAffineTransformIsIdentity //检测一个Transformation是不是恒等变换,也就是说不变bool CGAffineTransformIsIdentity ( CGAffineTransform t);//其结果返回一个BOOL值2、CGAffineTransformEqualToTransform //检测两个Transformation是否相等。bool CGAffineTransformEqualToTransform (CGAffineTransform t1,CGAffineTransform t2);&}

我要回帖

更多关于 affinetransformop 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信