首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > CSS >

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

2012-12-16 
Gesture手势 转自http://blog.sina.com.cn/s/blog_8a6c97b5010106zq.htmltap是指轻触手势。类似鼠标操作的

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的识别:

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

    ?

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

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

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

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

    在这里:

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

      对应的回调方法:

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

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

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

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

      ?

      ?

      ?

      ?

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

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

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

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

        ?

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

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

        - (void)viewDidLoad {?
        ????
        ???UISwipeGestureRecognizer *recognizer;?
        ????
        ??? recognizer =[[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom:)];?
        ??? [recognizersetDirection:(UISwipeGestureRecognizerDirectionRight)];?
        ??? [[self view]addGestureRecognizer:recognizer];?
        ??? [recognizerrelease];?
        ????
        ??? recognizer =[[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom:)];?
        ??? [recognizersetDirection:(UISwipeGestureRecognizerDirectionUp)];?
        ??? [[self view]addGestureRecognizer:recognizer];?
        ??? [recognizerrelease];?
        ????
        ??? recognizer =[[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom:)];?
        ??? [recognizersetDirection:(UISwipeGestureRecognizerDirectionDown)];?
        ??? [[self view]addGestureRecognizer:recognizer];?
        ??? [recognizerrelease];?
        ????
        ??? recognizer =[[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom:)];?
        ??? [recognizersetDirection:(UISwipeGestureRecognizerDirectionLeft)];?
        ??? [[self view]addGestureRecognizer:recognizer];?
        ??? [recognizerrelease];?
        ????
        ????
        ??? [superviewDidLoad];

        ?

        可以看到,都是同一个方法,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];?
        [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];?
        [UIView setAnimationRepeatAutoreverses:NO];?
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlDownforView:self.view cache:YES];

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

        [UIView commitAnimations];

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

        [UIView beginAnimations:@"animationID"context:nil];?
        [UIView setAnimationDuration:0.7f];?
        [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];?
        [UIView setAnimationRepeatAutoreverses:NO];?
        [UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUp?forView:self.viewcache: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.viewviewWithTag:currentTag];
          • 设置一个成员变量currentTag保存当前的tag值

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

            ???currentTag=1;?
            ????
            ??? NSString*path = [[NSBundle mainBundle] pathForResource:@"pageflip1"ofType:@"mp3"];?
            ???player=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURLfileURLWithPath:path] error:NULL];?
            ????
            ???//[[UIApplication sharedApplication] setStatusBarHidden:YESanimated:NO];?
            ???[[UIApplication sharedApplication] setStatusBarHidden:YESwithAnimation: UIStatusBarAnimationSlide];?
            ??? UIImageView*contentView = [[UIImageView alloc] initWithFrame:[[UIScreenmainScreen]applicationFrame]];??
            ??? [contentViewsetImage:[UIImage imageNamed:[pagesobjectAtIndex:(currentTag-1)]]];??
            ??? [contentViewsetUserInteractionEnabled:YES];?
            ???contentView.tag=currentTag;

            在翻页时的处理:

            if (currentTag<[pages count]){?
            ??? UIView*currentView=[self.viewviewWithTag:currentTag];?
            ???currentTag++;?
            ????
            ??? UIImageView*contentView = [[UIImageView alloc] initWithFrame:[[UIScreenmainScreen] applicationFrame]];?
            ??? [contentViewsetImage:[UIImage imageNamed:[pagesobjectAtIndex:(currentTag-1)]]];??
            ??? [contentViewsetUserInteractionEnabled:YES];?
            ???contentView.tag=currentTag;?
            ????
            ??? [UIViewbeginAnimations:@"animationID"context:nil];?
            ??? [UIViewsetAnimationDuration:0.7f];?
            ??? [UIViewsetAnimationCurve:UIViewAnimationCurveEaseInOut];?
            ??? [UIViewsetAnimationRepeatAutoreverses:NO];?
            ??? [UIViewsetAnimationTransition:UIViewAnimationTransitionCurlUpforView:self.view cache:YES];?
            ????
            ??? [currentViewremoveFromSuperview];?
            ??? [self.viewaddSubview:contentView];?
            ????
            ??? [UIViewcommitAnimations];

热点排行