您的位置:首页 > 产品设计 > UI/UE

iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer

2014-07-10 09:21 363 查看
首先新建一个基于Sigle view Application的项目,名为GestureTest;我的项目结构如下:



往viewController.xib文件里拖动一个imageView,并使覆盖整个屏幕,改动属性为:



viewController.h文件:
 
[cpp]viewplaincopy
 
1.     #import <UIKit/UIKit.h>  
2.       
3.     @interface ViewController : UIViewController{  
4.         IBOutlet UIImageView *imageView;  
5.     }  
6.     @property (nonatomic,retain)IBOutlet UIImageView *imageView;  
7.     @end  
并使xib文件里的imageView与之连接;
 
然后是viewController.m文件的实现部分:
 
[cpp]viewplaincopy
 
1.     @synthesize imageView;  
2.       
3.     CGFloat lastScaleFactor=1;//放大、缩小  
4.     CGFloat  netRotation;//旋转  
5.     CGPoint netTranslation;//平衡  
6.     NSArray *images;//图片数组  
7.     int imageIndex=0;//数组下标  
8.       
9.     - (void)viewDidLoad  
10.   {  
11.       //1、创建手势实例,并连接方法handleTapGesture,点击手势  
12.       UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTapGesture:)];  
13.       //设置手势点击数,双击:点2下  
14.       tapGesture.numberOfTapsRequired=2;  
15.       // imageView添加手势识别  
16.       [imageView addGestureRecognizer:tapGesture];  
17.       //释放内存  
18.       [tapGesture release];  
19.         
20.       //2、手势为捏的姿势:按住option按钮配合鼠标来做这个动作在虚拟器上  
21.       UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];  
22.       [imageView addGestureRecognizer:pinchGesture];//imageView添加手势识别  
23.       [pinchGesture release];  
24.         
25.       //3、旋转手势:按住option按钮配合鼠标来做这个动作在虚拟器上  
26.       UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];  
27.       [imageView addGestureRecognizer:rotateGesture];  
28.       [rotateGesture release];  
29.         
30.       //4、拖手势  
31.       UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];  
32.      // [imageView addGestureRecognizer:panGesture];  
33.       [panGesture release];  
34.         
35.       //5、划动手势  
36.       images=[[NSArray alloc]initWithObjects:@"cell.jpg",@"heihua.jpg",@"xuanyi.jpg", nil];  
37.       //右划  
38.       UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];  
39.       [imageView addGestureRecognizer:swipeGesture];  
40.       [swipeGesture release];  
41.       //左划  
42.       UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];  
43.       swipeGesture.direction=UISwipeGestureRecognizerDirectionLeft;//不设置黑夜是右  
44.       [imageView addGestureRecognizer:swipeLeftGesture];  
45.       [swipeLeftGesture release];  
46.         
47.       //6、长按手势  
48.       UILongPressGestureRecognizer *longpressGesutre=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongpressGesture:)];  
49.       //长按时间为1秒  
50.       longpressGesutre.minimumPressDuration=1;  
51.       //允许15秒中运动  
52.       longpressGesutre.allowableMovement=15;  
53.       //所需触摸1次  
54.       longpressGesutre.numberOfTouchesRequired=1;  
55.       [imageView addGestureRecognizer:longpressGesutre];  
56.       [longpressGesutre release];  
57.         
58.       [super viewDidLoad];  
59.       // Do any additional setup after loading the view, typically from a nib.  
60.   }  
61.   //双击屏幕时会调用此方法,放大和缩小图片  
62.   -(IBAction)handleTapGesture:(UIGestureRecognizer*)sender{  
63.       //判断imageView的内容模式是否是UIViewContentModeScaleAspectFit,该模式是原比例,按照图片原时比例显示大小  
64.       if(sender.view.contentMode==UIViewContentModeScaleAspectFit){  
65.           //把imageView模式改成UIViewContentModeCenter,按照图片原先的大小显示中心的一部分在imageView  
66.           sender.view.contentMode=UIViewContentModeCenter;  
67.       }else{  
68.           sender.view.contentMode=UIViewContentModeScaleAspectFit;  
69.       }  
70.   }  
71.   //捏的手势,使图片放大和缩小,捏的动作是一个连续的动作  
72.   -(IBAction)handlePinchGesture:(UIGestureRecognizer*)sender{  
73.       //得到sender捏手势的大小  
74.       CGFloat factor=[(UIPinchGestureRecognizer*)sender scale];  
75.       if(factor>1){  
76.           //图片放大  
77.           sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor+(factor-1), (lastScaleFactor+(factor-1)));  
78.                                                              
79.       }else{  
80.           //缩小  
81.           sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor*factor, lastScaleFactor*factor);  
82.                                                              
83.       }  
84.       //状态是否结束,如果结束保存数据  
85.       if(sender.state==UIGestureRecognizerStateEnded){  
86.           if(factor>1){  
87.               lastScaleFactor+=(factor-1);  
88.           }else{  
89.               lastScaleFactor*=factor;  
90.           }  
91.       }  
92.   }  
93.   //旋转手势  
94.   -(IBAction)handleRotateGesture:(UIGestureRecognizer*)sender{  
95.       //浮点类型,得到sender的旋转度数  
96.       CGFloat rotation=[(UIRotationGestureRecognizer*)sender rotation];  
97.       //旋转角度CGAffineTransformMakeRotation  
98.       CGAffineTransform transform=CGAffineTransformMakeRotation(rotation+netRotation);  
99.       //改变图像角度  
100. 
    sender.view.transform=transform;  
101. 
    //状态结束,保存数据  
102. 
    if(sender.state==UIGestureRecognizerStateEnded){  
103. 
        netRotation+=rotation;  
104. 
    }  
105. 
       
106. 
}  
107. 
//拖手势  
108. 
-(IBAction)handlePanGesture:(UIGestureRecognizer*)sender{  
109. 
    //得到拖的过程中的xy坐标  
110. 
    CGPoint translation=[(UIPanGestureRecognizer*)sender translationInView:imageView];  
111. 
    //平移图片CGAffineTransformMakeTranslation  
112. 
    sender.view.transform=CGAffineTransformMakeTranslation(netTranslation.x+translation.x, netTranslation.y+translation.y);  
113. 
    //状态结束,保存数据  
114. 
    if(sender.state==UIGestureRecognizerStateEnded){  
115. 
        netTranslation.x+=translation.x;  
116. 
        netTranslation.y+=translation.y;  
117. 
    }  
118. 
      
119. 
}  
120. 
//划动手势  
121. 
-(IBAction)handleSwipeGesture:(UIGestureRecognizer*)sender{  
122. 
    //划动的方向  
123. 
    UISwipeGestureRecognizerDirection direction=[(UISwipeGestureRecognizer*) sender direction];  
124. 
    //判断是上下左右  
125. 
    switch (direction) {  
126. 
        case UISwipeGestureRecognizerDirectionUp:  
127. 
            NSLog(@"up");  
128. 
            break;  
129. 
        case UISwipeGestureRecognizerDirectionDown:  
130. 
            NSLog(@"down");  
131. 
            break;  
132. 
        case UISwipeGestureRecognizerDirectionLeft:  
133. 
            NSLog(@"left");  
134. 
            imageIndex++;//下标++  
135. 
            break;  
136. 
        case UISwipeGestureRecognizerDirectionRight:  
137. 
            NSLog(@"right");  
138. 
            imageIndex--;//下标--  
139. 
            break;  
140. 
        default:  
141. 
            break;  
142. 
    }  
143. 
    //得到不越界不<0的下标  
144. 
    imageIndex=(imageIndex<0)?([images count]-1):imageIndex%[images count];  
145. 
    //imageView显示图片  
146. 
    imageView.image=[UIImage imageNamed:[images objectAtIndex:imageIndex]];  
147. 
      
148. 
}  
149. 
//长按手势  
150. 
-(IBAction)handleLongpressGesture:(UIGestureRecognizer*)sender{  
151. 
    //创建警告  
152. 
    UIActionSheet *actionSheet=[[UIActionSheet alloc]initWithTitle:@"Image options" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Save Image",@"Copy", nil];  
153. 
    //当前view显示警告  
154. 
    [actionSheet showInView:self.view];  
155. 
    [actionSheet release];  
156. 
}  
157. 
-(void)dealloc{  
158. 
    [images release];  
159. 
    [imageView release];  
160. 
    [super dealloc];  
161. 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐