作者:张浩杰_Hh | 来源:互联网 | 2023-09-24 19:35
第一, 手势是指从用一个或多个手指接触屏幕开始,直到手指离开屏幕为止的所有事件。 注意: 在iPhone中最多同时可以支持5点触摸,iPad中最多同时可以支持11点触
第一,
手势是指从用一个或多个手指接触屏幕开始,直到手指离开屏幕为止的所有事件。
注意:
在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];
}
}
结果: