热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手势,手势应用小程序

 第一,   手势是指从用一个或多个手指接触屏幕开始,直到手指离开屏幕为止的所有事件。   注意:   在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];
    }
   
}

 结果:

      手势,手势应用小程序

 

 

         

 

 


推荐阅读
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 如何在页面底部添加倾斜样式效果? ... [详细]
  • 微信小程序详解:概念、功能与优势
    微信公众平台近期向200位开发者发送了小程序的内测邀请。许多人对微信小程序的概念还不是很清楚。本文将详细介绍微信小程序的定义、功能及其独特优势。 ... [详细]
  • 对于众多创业公司而言,选择小程序或小视频的发展方向至关重要。本文将深入分析小程序和小视频的特点、优势及局限,帮助创业者做出更明智的选择。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • 本文详细介绍了如何在Unity中实现一个简单的广告牌着色器,帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许你参数化不同的请求、队列请求或者记录请求日志。本文将详细介绍命令模式的基本概念、组件及其在实际场景中的应用。 ... [详细]
  • Delphi XE Rtti单元深入解析:TRttiContext的应用与实践
    Delphi XE Rtti单元深入解析:TRttiContext的应用与实践 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 夸克网盘电脑版上线,实现三端同步备份与高效编辑播放功能 ... [详细]
author-avatar
张浩杰_Hh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有