首先在手势的使用中 经常涉及到图片坐标的变化 有时候需要判断的时候就需要绝对值
绝对值:
int abs(int i) 返回整型参数i的绝对值
double cabs(struct complex znum) 返回复数znum的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
而且有时候在循环当中添加手势的时候 需要知道手势的tag值 (一般来说 如果循环出来的每一个图片都有手势事件 那么这个图片的tag值就是手势的tag值)
表示的方法是:
UITapGestureRecognizer *tap = [[UITapGestureRecognizeralloc] initWithTarget:selfaction:@selector(tapGesRe:)];
// 那么 [tap view].tag 就是它的tag值;
- (void)tapGesRe:(UITapGestureRecognizer *)sender
{UITapGestureRecongnizer * tapGes = (UITapGestureRecongnizer *)sender;
// 或者直接使用 [sender view].tag
UIImageView *imageView = (UIImageView *)[self.view viewWithTag:[tapGes view].tag];
}
截取图片的方法(准确的说 是将一张图分割成一块一块的 比如拼图游戏)
UIImageView *iv = [[UIImageViewalloc] initWithFrame:CGRectMake(50,100, 100,100)];
[self.viewaddSubview:iv];
UIImage *img = [UIImageimageNamed:@"king2.png"];
iv.image = [selfclipImage:img rect:CGRectMake(80,80, 50,50)];
}
- (UIImage *)clipImage:(UIImage*)img rect:(CGRect)rect
{
CGImageRef imgRef =CGImageCreateWithImageInRect(img.CGImage, rect);
UIImage *subImage = [UIImageimageWithCGImage:imgRef];
return subImage;
}
下面是我自己写的一个拼图游戏 作为初学者 难免有错误 不要见笑
//宏头文件里定义的一些常量
#define SCR_LONGNUM 105
#define SCR_TAG 122
#define SCR_TEN 10
#define SCR_HUNDER 100
#define SCR_INTERVAL 5
#define SCR_BORDERWIDTH 3.f
//根视图里的代码如下
#import "RootViewController.h"
#import "Macro.h"
@interface RootViewController ()
@end
@implementation RootViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.view.backgroundColor = [UIColorblackColor];
[selfaddImageView];
}
- (void)addImageView
{
UIImage *image = [UIImageimageNamed:@"king2"];
UIImageView *originalImage = [[UIImageViewalloc] initWithFrame:CGRectMake(10,450, 200,200)];
originalImage.image = image;
[self.viewaddSubview:originalImage];
CGFloat imageW =SCR_HUNDER ;
CGFloat imageH =SCR_HUNDER ;
for (int i =0; i < 3; i ++)
{
CGFloat imageX =10 + imageW * i + SCR_INTERVAL * i;
for (int j =0; j < 3; j ++)
{
CGFloat imageY =20 + imageH * j + SCR_INTERVAL * j;
UIImageView *imageOne = [[UIImageViewalloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)];
imageOne.image = [selfclipImage:image rect:CGRectMake(imageW * i +SCR_INTERVAL * i,imageH * j + SCR_INTERVAL * j, imageW, imageH)];
imageOne.tag =SCR_HUNDER + i * SCR_TEN + j ;
imageOne.userInteractionEnabled =YES ;
UITapGestureRecognizer *tap = [[UITapGestureRecognizeralloc] initWithTarget:selfaction:@selector(clickTap:)];
[imageOne.layersetBorderColor:[UIColoryellowColor].CGColor];
[imageOne.layersetBorderWidth:SCR_BORDERWIDTH];
if (i ==2 && j == 2)
{
imageOne.image =nil;
imageOne.backgroundColor = [UIColorwhiteColor];
}
[imageOne addGestureRecognizer:tap];
[self.viewaddSubview:imageOne];
}
}
}
- (void)clickTap:(UITapGestureRecognizer *)sender
{
// UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender;
UIImageView *imageView = (UIImageView *)[self.viewviewWithTag:[sender view].tag];
UIImageView *imageNine = (UIImageView *)[self.viewviewWithTag:SCR_TAG];
NSLog(@"%ld",[senderview].tag);
long longNumX,longNumY;
longNumX = fabs(imageNine.center.x - imageView.center.x);
longNumY = fabs(imageNine.center.y - imageView.center.y);
if ((longNumX ==SCR_LONGNUM&& imageView.center.y == imageNine.center.y) || (longNumY == SCR_LONGNUM && imageNine.center.x == imageView.center.x))
{
CGPoint temp;
temp = imageNine.center;
imageNine.center = imageView.center;
imageView.center = temp;
}
else
{
}
}
- (UIImage *)clipImage:(UIImage *)image rect:(CGRect)rect;
{
CGImageRef imageRef =CGImageCreateWithImageInRect(image.CGImage, rect);
UIImage *subImage = [UIImageimageWithCGImage:imageRef];
return subImage;
}
@end
偏移量的问题(下面是转载的)
CoreGraphics框架中的CGAffineTransform类可用于设定UIView的transform属性,控制视图的缩放、旋转和平移操作:
另称放射变换矩阵,可参照线性代数的矩阵实现方式0.0
这里附上的CGAffineTransform官方文档:
总得来说,这个类中包含3张不同类型,分别使用如下3个方法创建数值;
1.CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)(平移:设置平移量)
2.CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)(缩放:设置缩放比例)仅通过设置缩放比例就可实现视图扑面而来和缩进频幕的效果。
3.CGAffineTransformMakeRotation(CGFloat angle)(旋转:设置旋转角度)
以上3个都是针对视图的原定最初位置的中心点为起始参照进行相应操作的,在操作结束之后可对设置量进行还原:
view.transform=CGAffineTransformIdentity;
另外还可以通过CGAffineTransformTranslate等方法对现有的transform进行进一步处理
transform我们一般称为形变属性,其本质是通过矩阵变化改变控件的大小、位置、角度等,这里我们通过一个例子来看一下具体的操作,在下面的例子中我们也会看到UIImageView控件的常用操作。
- //旋转
- - (IBAction)rotationButtonPressed:(id)sender
- {
- self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);
- }
- //缩放
- - (IBAction)scaleButtonPressed:(id)sender
- {
- self.imageView.transform = CGAffineTransformScale(self.imageView.transform, 0.9, 0.9);
- }
- - (IBAction)moveButtonPressed:(id)sender
- {
- _imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 10);
- 获得CGAffineTransform有多种方法,例如使用CGAffineTransformMake,但是对于矩阵操作相对比较麻烦,事实上iOS已经为我们准备好了三个方法:CGAffineTransformMakeRotation(旋转)、CGAffineTransformMakeScale(缩放)、CGAffineTransformMakeTranslation(移动);
- transform进行旋转、缩放、移动的时候不是在原来的基础上增量形变的,因此如果需要持续在原来的基础上旋转、缩放、移动那么每次需要在原来的基础上增加或减少。当然,我们可以定义一个全局变量进行累加,但是事实上iOS已经为我们提供好了三个对应的方法,分别用于在原来的角度、缩放、移动位置的基础上做出修改:CGAffineTransformRotate、CGAffineTransformScale、CGAffineTransformTranslate;
//偏移量清空
[sender setTranslation:CGPointZero inView:sender.view];
中心点
CGPoint