`
反求诸己
  • 浏览: 543188 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

Gesture手势 转自http://blog.sina.com.cn/s/blog_8a6c97b5010106zq.html

 
阅读更多

tap是指轻触手势。类似鼠标操作的点击。从iOS 3.2版本开始支持完善的手势api:

  • tap:轻触
  • long press:在一点上长按
  • pinch:两个指头捏或者放的操作
  • pan:手指的拖动
  • swipe:手指在屏幕上很快的滑动
  • rotation:手指反向操作

这为开发者编写手势识别操作,提供了很大的方便,想想之前用android写手势滑动的代码(编写android简单的手势切换视图示例 ),尤其感到幸福。

这里写一个简单的tap操作。在下面视图的蓝色视图内增加对tap的识别:

image

 

当用手指tap蓝色视图的时候,打印日志输出:

image

代码很简单,首先要声明tap的recognizer:

UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)]; 
[infoView addGestureRecognizer:recognizer]; 
[recognizer release];

在这里:

  • initWithTarget:self,要引用到Controller,因为一般这部分代码写在controller中,用self;
  • action:@selector(handleTapFrom:),赋值一个方法名,用于当手势事件发生后的回调;
  • [infoView addGestureRecognizer:recognizer],为view注册这个手势识别对象,这样当手指在该视图区域内,可引发手势,之外则不会引发

对应的回调方法:

-(void)handleTapFrom:(UITapGestureRecognizer *)recognizer{ 
    NSLog(@">>>tap it"); 
}

controller相关方法完整的代码(包含了一些与本文无关的视图构建代码):

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    //去掉最顶端的状态拦 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide]; 
    
    UIImage *image=[UIImage imageNamed:@"3.jpg"]; 
    
    //创建背景视图 
    self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    UIImageView *backgroudView=[[UIImageView alloc] initWithImage:image]; 
    [self.view addSubview:backgroudView]; 
    
     
    
    UIView *bottomView=[[UIView alloc]  initWithFrame:CGRectMake(0, 1024-70, 768, 70)]; 
    bottomView.backgroundColor=[UIColor grayColor]; 
    bottomView.alpha=0.8; 
    
    //UIButton *backButton=[[UIButton alloc] initWithFrame:CGRectMake(10, 10, 100, 40)]; 
    UIButton *backButton=[UIButton buttonWithType: UIButtonTypeRoundedRect]; 
    [backButton setTitle:@"ok" forState:UIControlStateNormal]; 
    backButton.frame=CGRectMake(10, 15, 100, 40); 
    
    [bottomView addSubview:backButton]; 
    
    [self.view addSubview:bottomView]; 
    
    UIView *infoView=[[UIView alloc] initWithFrame:CGRectMake(200, 700, 768-400, 70)]; 
    infoView.backgroundColor=[UIColor blueColor]; 
    infoView.alpha=0.6; 
    infoView.layer.cornerRadius=6; 
    infoView.layer.masksToBounds=YES; 
    [self.view addSubview:infoView]; 
    
    UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)]; 
    [infoView addGestureRecognizer:recognizer]; 
    [recognizer release]; 
}

-(void)handleTapFrom:(UITapGestureRecognizer *)recognizer{ 
    NSLog(@">>>tap it"); 
}

 

 

 

 

翻页效果,类似下面的样子:

image image

在电子书应用中会很常见。这里需要两个要点:

  • 翻页动画
  • 手势上下轻扫(swipe)的处理

 

先说一下轻扫(swipe)的实现,可以参考编写简单的手势示例:Tap 了解手势种类。

在viewDidLoad方法中注册了对上、下、左、右四个方向轻松的处理方法:

- (void)viewDidLoad { 
    
    UISwipeGestureRecognizer *recognizer; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)]; 
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)]; 
    [[self view] addGestureRecognizer:recognizer]; 
    [recognizer release]; 
    
    
    [super viewDidLoad];

 

可以看到,都是同一个方法,handleSwipeFrom。

在该方法中,再识别具体是哪个方向的轻扫手势,比如判断是向下的轻扫:

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { 
    NSLog(@"Swipe received."); 
    
    if (recognizer.direction==UISwipeGestureRecognizerDirectionDown) { 
        NSLog(@"swipe down");

判断是向上的轻扫:

if (recognizer.direction==UISwipeGestureRecognizerDirectionUp) { 
    NSLog(@"swipe up");

有关动画的处理,比如向下(往回)翻页,类似这样:

[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.7f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];

[currentView removeFromSuperview]; 
[self.view addSubview:contentView];

[UIView commitAnimations];

向上(向前)翻页,只需改为:

[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.7f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp  forView:self.view cache:YES];

[currentView removeFromSuperview]; 
[self.view addSubview:contentView];

[UIView commitAnimations];

如果是电子书,还需要考虑一个问题,就是有多个页面(图形),比如50页。那么需要有一个数据结构来保存这些页面的图片路径:

  • objc数据结构,比如数组
  • sqlite数据库表

这样,写一套翻页代码和加载什么图形之间就可以解耦。

本文示例使用的是数组,类似这样:

pages=[[NSArray alloc] initWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg",@"6.jpg", 
                 nil];

图片保存在resources下。

为了能让上页下页翻页的时候找到关联的页面,采用了如下机制:

  • 将图片封装为UIImageView显示
  • 可以为UIImageView设置一个tag值,值为数组下标+1
  • 这样,上级view有方法能根据tag查询到UIImageView,比如:UIView *currentView=[self.view viewWithTag:currentTag];
  • 设置一个成员变量currentTag保存当前的tag值

比如这样,当应用加载的时候显示第一页:

    currentTag=1; 
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"pageflip1" ofType:@"mp3"]; 
    player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL]; 
    
    //[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide]; 
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];  
    [contentView setImage:[UIImage imageNamed:[pages objectAtIndex:(currentTag-1)]]];  
    [contentView setUserInteractionEnabled:YES]; 
    contentView.tag=currentTag;

在翻页时的处理:

if (currentTag<[pages count]) { 
    UIView *currentView=[self.view viewWithTag:currentTag]; 
    currentTag++; 
    
    UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; 
    [contentView setImage:[UIImage imageNamed:[pages objectAtIndex:(currentTag-1)]]];  
    [contentView setUserInteractionEnabled:YES]; 
    contentView.tag=currentTag; 
    
    [UIView beginAnimations:@"animationID" context:nil]; 
    [UIView setAnimationDuration:0.7f]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationRepeatAutoreverses:NO]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
    
    [currentView removeFromSuperview]; 
    [self.view addSubview:contentView]; 
    
    [UIView commitAnimations];

分享到:
评论

相关推荐

    r58_evb_sc5806v4加载TP成功修改config 20160815 2026.7z

    rootroot@rootroot-E400:~/wyb/r58_evb_sc5806/lichee$ ./build.sh config Welcome to mkscript setup progress All available chips: 0. sun50iw1p1 1. sun8iw1p1 2. sun8iw3p1 3. sun8iw5p1 4. sun8iw6p1 5...

    复杂背景的手势数据集.zip

    使用Paddlehub的分割模型,将一些传统的手势数据进行图像分割,再将ADE2K的数据作为背景,与之合成为复杂背景的手势识别数据。 使用到的五个手势数据: [手势识别]...

    电影院选座管理 源码

    多点缩放移动:https://github.com/Almeros/android-gesture-detectors SelectSeatView:https://github.com/twl8023/SelectSeatView/ 功能: 1. 显示座位图 2. 可缩放 3. 可移动 4. 可选座 5....

    各种图片手势识别源码

    此控件基本包含所有的的手势操作, 2、基础配置  main项目可以生成jar包引用或者作为另外一个项目引用,但个人更喜欢直接引用代码,方便后续修改,也便于规范命名。  所以,大家可以直接将Main文件中的src的内容...

    gesturebuilder.zip

    《Android手势识别技术详解——基于GestureBuilder》 在Android应用开发中,手势识别技术是一种重要的交互方式,它允许用户通过特定的手势进行操作,提升用户体验。GestureBuilder是Android SDK提供的一种工具,...

    jQuery手势密码jQuery.gesture.password.js

    总之,jQuery.gesture.password.js是一款强大而灵活的手势密码插件,为Web应用提供了现代且用户友好的安全登录解决方案。它的易用性、可定制性和跨平台兼容性使其成为开发者的理想选择,尤其适合在移动优先的应用...

    C生成静态库给C++调用出现undefined reference to ...解决方案_cpp

    在C++程序中调用C编译的静态库时,可能会遇到“undefined reference to ...”错误,这通常意味着链接器无法找到对应的函数定义。要解决这个问题,我们需要理解C与C++之间的互操作性以及编译和链接过程。...

    GestureLockView:九宫格手势密码的实现

    手势锁定视图由于Genymotion,帧卡住了,,,, wtf =。= 用法: 将JitPack存储库添加到您的构建文件中: repositories { // ... maven { url "https://jitpack.io" }}以以下形式添加依赖项: dependencies { ...

    ios-长按结束(防keep).zip

    在iOS开发中,"长按结束(防keep)"这一主题主要涉及到手势识别(Gesture Recognizers)和用户交互设计。在iOS应用中,长按手势(UILongPressGestureRecognizer)常用于执行一些特殊操作,如拖放、菜单显示等。"防keep...

    手势识别数据库(已标记)

    本数据集数据取自 https://lttm.dei.unipd.it//downloads/gesture/ 原数据集包含了14个人采集的共1400张样本,共10种手势。包括RGB图像、深度信息等,原图大小1280*960。 本数据集只选用了RGB图像,并将图像缩小为...

    ios-手势控制:点击、滑动、平移、捏合、旋转、长按、轻扫.zip

    手势识别器(Gesture Recognizer)用于识别触摸序列并触发响应事件。当手势识别器识别到一个手势或手势发生变化时,会触发响应事件。UIGestureRecognizer类作为抽象类,不能直接使用。只能使用UIGestureRecognizer的...

    自定义手势(gesture)和手势识别

    在Android开发中,手势(Gesture)和手势识别是提升用户体验的重要技术之一。用户可以通过简单的手势操作,如滑动、点击、捏合等,与应用程序进行交互。本篇将深入探讨自定义手势(gesture)和手势识别,特别是如何...

    sketch:Sketch是Android上一个强大且全面的图片加载器,支持GIF,手势缩放以及分块显示超大图片。Sketch是Android上强大而全面的图像加载器,支持GIF,手势缩放,超大块显示图片

    Sketch是Android上层强大且全面的图片加载器,除了图片加载的必备功能外,还支持GIF,手势缩放,分块显示超大图片,自动校正图片方向,显示视频片段等功能 示例APP 扫描二维码下载或 特性 支持的特性 多种 URI 支持...

    Python库 | gesture_classifying_model-0.1.10.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:gesture_classifying_model-0.1.10.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    OpenCV手势识别-手掌特征提取源码

    本文对http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/hull/hull.html#hull以及http://www.intorobotics.com/9-opencv-tutorials-hand-gesture-detection-recognition/两个部分进行合并。...

    Internet Explorer 6.0 鼠标手势插件v1.10

    软件主页: http://davidhowecn.googlepages.com/ie6gesture 在IE6的网页界面中, 按住鼠标右键, 拖动鼠标, 然后弹起鼠标右键, 将根据鼠标的移 动方向来完成如下的一些快捷功能: 向左移动 - 返回上一个页面; ...

    ASL_Gesture_Recognition

    ASL_Gesture_Recognition入门git clone https://github.com/wnukmat/ASL_Gesture_Recognition数据集https://www.kaggle.com/datamunge/sign-language-mnist/data &lt;br&gt;https://www.bu.edu/av/asllrp/dai-asllvd.html ...

    Egret手势识别库egret_gesture-master.zip

    Egret手势识别库egret_gesture目前已实现的手势: 1. Tap(点一下) 2. Double Tap (双击) 3. Pinch(二指往內或往外拨动,平时经常用到的缩放) 4. Rotation(旋转) 5. Swipe(滑动,快速移动) 6. Pan (拖移,慢速移动) 7...

    js touch触屏gesture手势demo

    JavaScript Touch事件和Gesture手势在移动设备开发中扮演着至关重要的角色,特别是在构建触摸友好型的Web应用时。本文将深入探讨“js touch触屏gesture手势demo”中的关键知识点,包括Touch事件模型、常见手势识别...

    TitaniumMobile模块识别旋转和捏合捏合手势_Objective-C_Python_下载.zip

    在移动应用开发中,手势识别是提升用户体验的关键因素之一。Titanium Mobile 是一个跨平台的JavaScript框架,允许开发者使用JavaScript来构建原生的iOS和Android应用程序。本篇将深入探讨如何在Titanium Mobile中...

Global site tag (gtag.js) - Google Analytics