第一,
手势是指从用一个或多个手指接触屏幕开始,直到手指离开屏幕为止的所有事件。
注意:
在iPhone中最多同时可以支持5点触摸,iPad中最多同时可以支持11点触摸。模拟器中按下option键,可以模拟两点触摸。
第二,
手势识别器:UIGestureRecognizer
关系:UIGestureRecognizer是在Touch的基础上封装出来的;
UIGestureRecognizer的子类:
UITapGestureRecognizer;//轻拍识别器
UILongPressGestureRecognizer;//长按识别器
UISwipGestureRecognizer;//轻扫识别器
UIRotationGestureRecognizer;//旋转识别器
UIPinchGestureRecognizer;//捏合识别器
UIPanGestureRecognizer;//拖动识别器
下面是手势识别器的简单应用
在我们创建的根视图文件中:
RootViewController.m文件中
-(void)viewDidLoad
[super viewDidLoad]; imageNumber =1; // Do any additional setup after loading the view from its nib. NSArray *titles = @[@"轻拍",@"长按",@"轻扫",@"旋转",@"捏合",@"拖拽"]; //定义选择控件 UISegmentedControl *segment = [[UISegmentedControl alloc]initWithItems:titles]; segment.frame = CGRectMake(0, 460-30, 320, 30); //根据值的变化控制不同的事件 [segment addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:segment]; //生成图片视图 //全局变量 imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50,80 , 220,280)]; imageView.image = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"h1" ofType:@"jpeg"]]; imageView.userInteractionEnabled = YES;//允许用户交互 [self.view addSubview:imageView]; //设置动画 //滑动控件 UISlider *slider = [[UISlider alloc]initWithFrame:CGRectMake(50, 30, 220, 10)]; slider.maximumValue = 7;//设置最大值 slider.minimumValue = 0.5;//设置最小值 [slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:slider]; //定义按钮 NSArray *titleArr = [[NSArray alloc]initWithObjects:@"动画开始",@"动画结束", nil]; for (int i=0; i<[titleArr count]; i++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(30+130*i, 380, 120, 30); [btn setTag:101+i]; [btn setTitle:[titleArr objectAtIndex:i] forState:UIControlStateNormal]; [btn addTarget:self action:@selector(startAction:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:btn]; }
//选择事件关联方法
-(void)segmentAction:(id)sender
UISegmentedControl *segmentedControl = (UISegmentedControl*)sender;//拿到segment的每个控件 //移除上一次手势 保证只有一个手势在视图上 UIGestureRecognizer手势识别器的父类 for (UIGestureRecognizer*recognizer in imageView.gestureRecognizers) { [imageView removeGestureRecognizer:recognizer]; } switch (segmentedControl.selectedSegmentIndex) { case 0: { NSLog(@"点击轻拍"); //定义轻怕手势类 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)]; // tap.numberOfTapsRequired = 1;//得到轻拍次数 [imageView addGestureRecognizer:tap]; } break; case 1: { NSLog(@"点击长按"); //定义长按手势类 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)]; [imageView addGestureRecognizer:longPress]; } break; case 2: { NSLog(@"点击轻扫"); //定义轻扫手势类 UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)]; // swipe.direction = UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight; [imageView addGestureRecognizer:swipe]; } break; case 3: { NSLog(@"点击旋转"); //定义旋转手势类 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationAction:)]; [imageView addGestureRecognizer:rotation]; } break; case 4: { NSLog(@"点击捏合"); UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)]; [imageView addGestureRecognizer:pinch]; } break; case 5: { NSLog(@"点击拖拽"); UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)]; [imageView addGestureRecognizer:pan]; } break; default: break; }
//轻拍方法
-(void)tapAction:(id)sender
NSLog(@"轻拍成功"); imageNumber=arc4random()%7+1;//获取随机数1-8 imageView.image = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"h%d",imageNumber] ofType:@"jpeg"]];//生成8个随机图片
//长按方法
-(void)longPressAction:(id)sender
NSLog(@"长按方法"); if (imageNumber>6) { imageNumber = -1; } // NSLog(@"%d",imageNumber); imageNumber +=2; imageView.image = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"h%d",imageNumber] ofType:@"jpeg"]];
//定义轻扫方法
-(void)swipeAction:(id)sender
UISwipeGestureRecognizer *swipe = (UISwipeGestureRecognizer*)sender; if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { if (imageNumber>1) { imageNumber-=1;//向右滑-1 }else if (imageNumber ==0) { imageNumber =1; } else if (imageNumber ==1) { imageNumber =8; } } imageView.image = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle]pathForResource:[NSString stringWithFormat:@"h%d",imageNumber] ofType:@"jpeg"]];
//定义旋转方法
-(void)rotationAction:(id)sender
NSLog(@"旋转"); UIRotationGestureRecognizer *rotation = (UIRotationGestureRecognizer*)sender; imageView.transform = CGAffineTransformMakeRotation(rotation.rotation);
//定义捏合方法
-(void)pinchAction:(id)sender
UIPinchGestureRecognizer *pinch = (UIPinchGestureRecognizer*)sender;
imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);
//定义拖拽方法
-(void)panAction:(id)sender
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer*)sender; NSLog(@"拖拽"); //判断 一次 相当于touchBegin if (pan.state == UIGestureRecognizerStateBegan) { startPoint = [pan locationInView:self.view];//得到第一状态的点 } CGPoint newPoint = [pan locationInView:self.view];//得到现在状态的点 CGFloat contextOffX = newPoint.x - startPoint.x;//得到移动后的x 偏移量 CGFloat contextOffY = newPoint.y - startPoint.y;//得到移动后的y 偏移量 imageView.center = CGPointMake(imageView.center.x+contextOffX, imageView.center.y+contextOffY); startPoint = newPoint;
//动画方法
-(void)startAction:(id)sender
UIButton *btn = (UIButton*)sender; if (btn.tag ==101) { NSLog(@"动画开始"); NSMutableArray *imageArr = [[NSMutableArray alloc]init]; for (int i=1; i<7; i++) { UIImage *currentImage = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"run%d",i] ofType:@"tiff"]]; [imageArr addObject:currentImage]; } imageView.animationImages = (NSArray*)imageArr; [imageView startAnimating]; }else if (btn.tag ==102) { NSLog(@"动画结束"); [imageView stopAnimating]; }
-(void)sliderAction:(id)sender { UISlider *slider = (UISlider*)sender; NSLog(@"%f",slider.value); if (imageView.isAnimating) { imageView.animationDuration = slider.value; [imageView startAnimating]; } }
结果: