手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加了移动设备使用便捷性。
iOS系统在3.2以后,为方便开发这使用一些常用的手势,提供了UIGestureRecognizer类。手势识别UIGestureRecognizer类是个抽象类,下面的子类是具体的手势,开发这可以直接使用这些手势识别。
UITapGestureRecognizer
UIPinchGestureRecognizer
UIRotationGestureRecognizer
UISwipeGestureRecognizer
UIPanGestureRecognizer
UILongPressGestureRecognizer
上面的手势对应的操作是:
- Tap(点一下)
- Pinch(二指往內或往外拨动,平时经常用到的缩放)
- Rotation(旋转)
- Swipe(滑动,快速移动)
- Pan (拖移,慢速移动)
- LongPress(长按)
2、使用手势的步骤
使用手势很简单,分为两步:
- 创建手势实例。当创建手势时,指定一个回调方法,当手势开始,改变、或结束时,回调方法被调用。
- 添加到需要识别的View中。每个手势只对应一个View,当屏幕触摸在View的边界内时,如果手势和预定的一样,那就会回调方法。
ps:一个手势只能对应一个View,但是一个View可以有多个手势。
手势具体操作 如下:
新建一个mainViewController 继承于 UIViewcontroller ,
mainViewController.m
#import "mainViewController.h"
@interface mainViewController ()
@property (retain, nonatomic)UIImageView *imageView;
@end
@implementation mainViewController
- (void)dealloc{
[self.imageView release];
[super dealloc];
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self createSubViews];
}
- (void)createSubViews{
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(70, 130, 220, 350)];
[_imageView setImage:[UIImage imageNamed:@"1.jpg"]];
_imageView.userInteractionEnabled = YES;
[self.view addSubview:_imageView];
[_imageView release];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"点击", @"长按", @"轻扫", @"捏合", @"旋转", @"拖拽", nil]];
segmentedControl.frame = CGRectMake(30, 600, 315, 50);
segmentedControl.momentary = YES;
segmentedControl.tintColor = [UIColor blackColor];
[segmentedControl addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:segmentedControl];
[segmentedControl release];
}
#pragma mari - UISegmentedControl的点击事件
- (void)action:(id)sender{
// 分段点击按钮
UISegmentedControl *seg = (UISegmentedControl *)sender;
// 移除imageView的所有手势,重新添加新的手势
// 第一步:获得一个视图的所有手势
NSArray *gestures = self.imageView.gestureRecognizers;
// 第二步:移除
for (UIGestureRecognizer *ges in gestures) {
[self.imageView removeGestureRecognizer:ges];
}
switch (seg.selectedSegmentIndex) {
case 0:
{
// 创建一个点击手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
[self.imageView addGestureRecognizer:tap];
[tap release];
}
break;
case 1:
{
// 长按手势
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)];
[self.imageView addGestureRecognizer:longPress];
[longPress release];
}
break;
case 2:
{
UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)];
// 一个轻扫手势只能有一个轻扫方向
// 设置轻扫的方向
swipe.direction = UISwipeGestureRecognizerDirectionDown;
[self.imageView addGestureRecognizer:swipe];
[swipe release];
}
break;
case 3:
{
// 捏合手势
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAciton:)];
[self.imageView addGestureRecognizer:pinch];
[pinch release];
}
break;
case 4:
{
// 旋转手势
UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotateAction:)];
[self.imageView addGestureRecognizer:rotate];
[rotate release];
}
break;
case 5:
{
// 拖拽手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
[self.imageView addGestureRecognizer:pan];
[pan release];
}
break;
default:
break;
}
}
#pragma mark - 内部的点击手势事件
#pragma mark 点击
- (void)tapAction:(UITapGestureRecognizer *)tap{
// 通过手势获得手势所在的视图
// UIImageView *aImage = (UIImageView *)tap.view;
// 通过不同的状态做不同的事
if (tap.state == UIGestureRecognizerStateBegan) {
NSLog(@"开始点击");
}
NSLog(@"%s", __func__);
}
#pragma mark 长按
- (void)longPressAction:(UILongPressGestureRecognizer *)press{
if (press.state == UIGestureRecognizerStateBegan) {
NSLog(@"begin");
}
}
#pragma mark 轻扫
- (void)swipeAction:(UISwipeGestureRecognizer *)swipe{
NSLog(@"横扫千军");
}
#pragma mark 捏合
- (void)pinchAciton:(UIPinchGestureRecognizer *)pinch{
NSLog(@"捏合");
self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale);
pinch.scale = 1.0f;
}
#pragma mark 旋转
- (void)rotateAction:(UIRotationGestureRecognizer *)ges{
// 旋转的基础角度为0, 每次旋转的角度都是以当前中轴线为轴来判定的
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, ges.rotation);
ges.rotation = 0;
NSLog(@"Rotation = %f", ges.rotation);
}
#pragma mark 拖拽
- (void)panAction:(UIPanGestureRecognizer *)pan{
CGPoint point = [pan translationInView:self.imageView];
// 偏移量会在每次偏移之后,在偏移后的基础上增加
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, point.x, point.y);
// 重新把偏移量归零
[pan setTranslation:CGPointZero inView:self.imageView];
}
AppDelegate.m
#import "AppDelegate.h"
#import "mainViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (void)dealloc{
[super dealloc];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
_window.backgroundColor = [UIColor whiteColor];
[_window makeKeyAndVisible];
[_window release];
mainViewController *myView = [[mainViewController alloc] init];
[self.window setRootViewController:myView];
[myView release];
return YES;
}