仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1991|回复: 18
打印 上一主题 下一主题

[学习教程] IOS制作之iOS手势辨认的具体利用(拖动,缩放,扭转,点击,手势依附,自界说手势)仓酷云 ...

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
管理所有设备发生的事件比如屏幕旋转屏幕关闭或者一些其他的程序的控制逻辑也应该写在这里他的初始化函数是-(id)initWithNibName:(NSString*)nibNamebundle:(NSBundle*)nibBundle后面那个NibName是InterfaceBuilder里设计的界面现在IB已经集成到XCode里了1、UIGestureRecognizer先容

手势辨认在iOS上十分主要,手势操纵挪动设备的主要特性,极年夜的增添了挪动设备利用便利性。
iOS体系在3.2今后,为便利开辟这利用一些经常使用的手势,供应了UIGestureRecognizer类。手势辨认UIGestureRecognizer类是个笼统类,上面的子类是详细的手势,开辟这能够间接利用这些手势辨认。


  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer
下面的手势对应的操纵是:


  • Tap(点一下)
  • Pinch(二指往然蛲獠Χ绞本S玫降乃醴牛
  • Rotation(扭转)
  • Swipe(滑动,疾速挪动)
  • Pan(拖移,慢速挪动)
  • LongPress(长按)
UIGestureRecognizer的承继干系以下:

<br>
2、利用手势的步骤

利用手势很复杂,分为两步:

  • 创立手势实例。当创立手势时,指定一个回调办法,当手势入手下手,改动、或停止时,回调办法被挪用。
  • 增加到必要辨认的View中。每一个手势只对应一个View,当屏幕触摸在View的界限内时,假如手势和预定的一样,那就会回调办法。
ps:一个手势只能对应一个View,可是一个View能够有多个手势。
倡议在真机上运转这些手势,摹拟器操纵不太便利,大概招致你以为手势生效。
3、Pan拖下手势:


  • UIImageView*snakeImageView=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"snake.png"]];
  • snakeImageView.frame=CGRectMake(50,50,100,160);
  • UIPanGestureRecognizer*panGestureRecognizer=[[UIPanGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handlePan:)];
  • [snakeImageViewaddGestureRecognizer:panGestureRecognizer];
  • [self.viewsetBackgroundColor:[UIColorwhiteColor]];
  • [self.viewaddSubview:snakeImageView];
新建一个ImageView,然后增加手势
回调办法:

  • -(void)handlePan:(UIPanGestureRecognizer*)recognizer
  • {
  • CGPointtranslation=[recognizertranslationInView:self.view];
  • recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x,
  • recognizer.view.center.y+translation.y);
  • [recognizersetTranslation:CGPointZeroinView:self.view];

  • }
4、Pinch缩撒手势


  • UIPinchGestureRecognizer*pinchGestureRecognizer=[[UIPinchGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handlePinch:)];<pclass="p1">[<spanclass="s1">snakeImageView</span><spanclass="s2">addGestureRecognizer</span>:pinchGestureRecognizer];</p>

  • -(void)handlePinch:(UIPinchGestureRecognizer*)recognizer
  • {
  • recognizer.view.transform=CGAffineTransformScale(recognizer.view.transform,recognizer.scale,recognizer.scale);
  • recognizer.scale=1;
  • }
5、Rotation扭转手势


  • UIRotationGestureRecognizer*rotateRecognizer=[[UIRotationGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handleRotate:)];
  • [snakeImageViewaddGestureRecognizer:rotateRecognizer];

  • -(void)handleRotate:(UIRotationGestureRecognizer*)recognizer
  • {
  • recognizer.view.transform=CGAffineTransformRotate(recognizer.view.transform,recognizer.rotation);
  • recognizer.rotation=0;
  • }

<br>
<br>
增加了这几个手势后,运转看效果,程序中的imageView放了一个
/^/^
_|__|O|
//~_/
____|__________/
_______
`
||
//
//
//
//
//_----_
//_-~~-_||
((_-~_--_~-__/|
~-____-~_-~~-_~-_-~/
~-__-~~-__-~
~--______-~~-___-~
的图片,在摹拟器上拖动是没成绩的。缩放和扭转有点成绩,估量是由于在摹拟器上的摹拟的两个打仗点间隔在imageView的界限外了,以是操纵有效果。
倡议在真机上运转这个手势。
在摹拟器上缩放和选择的操纵技能:
能够把imageView的frame值设置年夜一点,按住alt键,按下触摸板(不按下不可),如许就能够扭转和缩放了。
6、增加第二个ImagView并增加手势

记着:一个手势只能增加到一个View,两个View固然要有两个手势的实例了

  • -(void)viewDidLoad
  • {
  • [superviewDidLoad];

  • UIImageView*snakeImageView=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"snake.png"]];
  • UIImageView*dragonImageView=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"dragon.png"]];
  • snakeImageView.frame=CGRectMake(120,120,100,160);
  • dragonImageView.frame=CGRectMake(50,50,100,160);
  • [self.viewaddSubview:snakeImageView];
  • [self.viewaddSubview:dragonImageView];

  • for(UIView*viewinself.view.subviews){
  • UIPanGestureRecognizer*panGestureRecognizer=[[UIPanGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handlePan:)];

  • UIPinchGestureRecognizer*pinchGestureRecognizer=[[UIPinchGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handlePinch:)];

  • UIRotationGestureRecognizer*rotateRecognizer=[[UIRotationGestureRecognizeralloc]
  • initWithTarget:self
  • action:@selector(handleRotate:)];

  • [viewaddGestureRecognizer:panGestureRecognizer];
  • [viewaddGestureRecognizer:pinchGestureRecognizer];
  • [viewaddGestureRecognizer:rotateRecognizer];
  • [viewsetUserInteractionEnabled:YES];
  • }
  • [self.viewsetBackgroundColor:[UIColorwhiteColor]];
  • }
多增加了一条龙的view,两个view都能吸收下面的三种手势。运转效果以下:

<br>
7、拖动(pan手势)速率(以较快的速率拖放后view有滑行的效果)

怎样完成呢?

  • 监督手势是不是停止
  • 监督触摸的速率

  • -(void)handlePan:(UIPanGestureRecognizer*)recognizer
  • {
  • CGPointtranslation=[recognizertranslationInView:self.view];
  • recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x,
  • recognizer.view.center.y+translation.y);
  • [recognizersetTranslation:CGPointZeroinView:self.view];

  • if(recognizer.state==UIGestureRecognizerStateEnded){

  • CGPointvelocity=[recognizervelocityInView:self.view];
  • CGFloatmagnitude=sqrtf((velocity.x*velocity.x)+(velocity.y*velocity.y));
  • CGFloatslideMult=magnitude/200;
  • NSLog(@"magnitude:%f,slideMult:%f",magnitude,slideMult);

  • floatslideFactor=0.1*slideMult;//Increaseformoreofaslide
  • CGPointfinalPoint=CGPointMake(recognizer.view.center.x+(velocity.x*slideFactor),
  • recognizer.view.center.y+(velocity.y*slideFactor));
  • finalPoint.x=MIN(MAX(finalPoint.x,0),self.view.bounds.size.width);
  • finalPoint.y=MIN(MAX(finalPoint.y,0),self.view.bounds.size.height);

  • [UIViewanimateWithDuration:slideFactor*2delay:0options:UIViewAnimationOptionCurveEaseOutanimations:^{
  • recognizer.view.center=finalPoint;
  • }completion:nil];

  • }

代码完成剖析:

  • 盘算速率向量的长度(估量年夜部分都忘了)这些常识了。
  • 假如速率向量小于200,那就会失掉一个小于的小数,那末滑行会很短
  • 基于速率和速率要素盘算一个尽头
  • 确保尽头不会跑出父View的界限
  • 利用UIView动画使view滑动到尽头
运转后,疾速拖动图象view摊开会看到view还会在本来的偏向滑行一段路。
8、同时触发两个view的手势

手势之间是互斥的,假如你想同时触发蛇和龙的view,那末必要完成协定
UIGestureRecognizerDelegate,

  • @interfaceViewController:UIViewController<UIGestureRecognizerDelegate>
  • @end
并在协定这个办法里前往YES。

  • -(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizershouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer
  • {
  • returnYES;
  • }
把self作为代办署理设置给手势:

  • panGestureRecognizer.delegate=self;
  • pinchGestureRecognizer.delegate=self;
  • rotateRecognizer.delegate=self;
如许能够同时拖动或扭转缩放两个view了。
9、tap点击手势

这里为了便利看到tap的效果,当点击一下屏幕时,播放一个声响。
为了播放声响,我们到场AVFoundation.framework这个框架。

  • -(AVAudioPlayer*)loadWav:(NSString*)filename{
  • NSURL*url=[[NSBundlemainBundle]URLForResource:filenamewithExtension:@"wav"];
  • NSError*error;
  • AVAudioPlayer*player=[[AVAudioPlayeralloc]initWithContentsOfURL:urlerror:&error];
  • if(!player){
  • NSLog(@"Errorloading%@:%@",url,error.localizedDescription);
  • }else{
  • [playerprepareToPlay];
  • }
  • returnplayer;
  • }
我会在最初例子代码给出完全代码,增加手势的步骤和后面一样的。

  • #import<UIKit/UIKit.h>
  • #import<AVFoundation/AVFoundation.h>

  • @interfaceViewController:UIViewController<UIGestureRecognizerDelegate>
  • @property(strong)AVAudioPlayer*chompPlayer;
  • @property(strong)AVAudioPlayer*hehePlayer;

  • @end

  • -(void)handleTap:(UITapGestureRecognizer*)recognizer{
  • [self.chompPlayerplay];
  • }
运转,点一下某个图,就会播放一个咬工具的声响。
不外这个点击播放声响有点缺点,就是在渐渐拖动的时分也会播放。这使得两个手势重合了。怎样办理呢?利用手势的:requireGestureRecognizerToFail办法。
10、手势的依附性

在viewDidLoad的轮回里增加这段代码:

  • [tapRecognizerrequireGestureRecognizerToFail:panGestureRecognizer];
意义就是,当假如pan手势失利,就是没产生拖动,才会动身tap手势。如许假如你有稍微的拖动,那就是pan手势产生了。tap的声响就不会收回来了。
11、自界说手势

自界说手势承继:UIGestureRecognizer,完成上面的办法:

  • &ndash;touchesBegan:withEvent:
  • &ndash;touchesMoved:withEvent:
  • &ndash;touchesEnded:withEvent:
  • -touchesCancelled:withEvent:
新建一个类,承继UIGestureRecognizer,代码以下:
.h文件

  • #import<UIKit/UIKit.h>
  • typedefenum{
  • DirectionUnknown=0,
  • DirectionLeft,
  • DirectionRight
  • }Direction;

  • @interfaceHappyGestureRecognizer:UIGestureRecognizer
  • @property(assign)inttickleCount;
  • @property(assign)CGPointcurTickleStart;
  • @property(assign)DirectionlastDirection;

  • @end
.m文件

照着书上的例子,一个一个做下来,只要不是文盲,就都会的呀,没有体现我的一点点个人价值。所以我决定了,不能再这样下去
再见西城 该用户已被删除
沙发
发表于 2015-1-21 09:44:42 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
变相怪杰 该用户已被删除
板凳
发表于 2015-1-24 06:22:42 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
海妖 该用户已被删除
地板
发表于 2015-1-28 05:19:36 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
分手快乐 该用户已被删除
5#
发表于 2015-2-1 22:19:33 | 只看该作者
在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。
飘飘悠悠 该用户已被删除
6#
发表于 2015-2-7 15:30:16 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
第二个灵魂 该用户已被删除
7#
发表于 2015-2-10 17:18:08 | 只看该作者
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
透明 该用户已被删除
8#
发表于 2015-3-1 13:01:32 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
老尸 该用户已被删除
9#
发表于 2015-3-4 21:04:25 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
乐观 该用户已被删除
10#
发表于 2015-3-11 16:26:26 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
深爱那片海 该用户已被删除
11#
 楼主| 发表于 2015-3-15 22:27:15 | 只看该作者
特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地
愤怒的大鸟 该用户已被删除
12#
发表于 2015-3-22 17:10:30 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
蒙在股里 该用户已被删除
13#
发表于 2015-4-4 09:47:26 | 只看该作者
最后在做项目的时候一定要认真对待,毕竟这个直接和你的就业挂钩,这也是锻炼你实际操作的能力。
灵魂腐蚀 该用户已被删除
14#
发表于 2015-4-6 06:50:40 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
活着的死人 该用户已被删除
15#
发表于 2015-4-15 05:12:28 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
冷月葬花魂 该用户已被删除
16#
发表于 2015-4-15 16:37:38 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
柔情似水 该用户已被删除
17#
发表于 2015-5-1 14:11:58 | 只看该作者
在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解
小妖女 该用户已被删除
18#
发表于 2015-5-5 23:20:31 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
谁可相欹 该用户已被删除
19#
发表于 2015-5-10 10:52:12 | 只看该作者
还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:02

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表