IOS的一些手势方法(手势的tag值 绝对值 偏移量 中心点 等等)

本文介绍了在iOS开发中如何利用手势识别处理图片,包括手势的tag值获取、绝对值计算以及图像截取。通过示例展示了在循环中添加手势识别,并在点击事件中通过计算手势触发的图片中心点偏移量来进行拼图游戏的实现。同时,还涉及到了视图的平移、缩放和旋转操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先在手势的使用中 经常涉及到图片坐标的变化  有时候需要判断的时候就需要绝对值

绝对值:

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官方文档:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/index.html

 

总得来说,这个类中包含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控件的常用操作。


  1. //旋转  
  2. - (IBAction)rotationButtonPressed:(id)sender  
  3. {  
  4.     self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);  
  5. }  
  6. //缩放  
  7. - (IBAction)scaleButtonPressed:(id)sender  
  8. {  
  9.     self.imageView.transform = CGAffineTransformScale(self.imageView.transform0.90.9);  
  10. }  
  11.   
  12. - (IBAction)moveButtonPressed:(id)sender  
  13. {  
  14.     _imageView.transform = CGAffineTransformTranslate(self.imageView.transform010);
  • 获得CGAffineTransform有多种方法,例如使用CGAffineTransformMake,但是对于矩阵操作相对比较麻烦,事实上iOS已经为我们准备好了三个方法:CGAffineTransformMakeRotation(旋转)、CGAffineTransformMakeScale(缩放)、CGAffineTransformMakeTranslation(移动);
  • transform进行旋转、缩放、移动的时候不是在原来的基础上增量形变的,因此如果需要持续在原来的基础上旋转、缩放、移动那么每次需要在原来的基础上增加或减少。当然,我们可以定义一个全局变量进行累加,但是事实上iOS已经为我们提供好了三个对应的方法,分别用于在原来的角度、缩放、移动位置的基础上做出修改:CGAffineTransformRotate、CGAffineTransformScale、CGAffineTransformTranslate;


//偏移量清空

[sender setTranslation:CGPointZero inView:sender.view];


中心点

CGPoint   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值