Gesture手势 转自http://blog.sina.com.cn/s/blog_8a6c97b5010106zq.html
tap是指轻触手势。类似鼠标操作的点击。从iOS 3.2版本开始支持完善的手势api:
这为开发者编写手势识别操作,提供了很大的方便,想想之前用android写手势滑动的代码(编写android简单的手势切换视图示例),尤其感到幸福。
这里写一个简单的tap操作。在下面视图的蓝色视图内增加对tap的识别:
?
当用手指tap蓝色视图的时候,打印日志输出:
代码很简单,首先要声明tap的recognizer:
UITapGestureRecognizer *recognizer=[[UITapGestureRecognizer alloc]initWithTarget:selfaction:@selector(handleTapFrom:)];?
[infoView addGestureRecognizer:recognizer];?
[recognizer release];
在这里:
对应的回调方法:
-(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");?
}
?
?
?
?
翻页效果,类似下面的样子:
在电子书应用中会很常见。这里需要两个要点:
?
先说一下轻扫(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页。那么需要有一个数据结构来保存这些页面的图片路径:
这样,写一套翻页代码和加载什么图形之间就可以解耦。
本文示例使用的是数组,类似这样:
pages=[[NSArray alloc]initWithObjects:@"1.jpg",@"2.jpg",@"3.jpg",@"4.jpg",@"5.jpg",@"6.jpg",?
????????????????nil];
图片保存在resources下。
为了能让上页下页翻页的时候找到关联的页面,采用了如下机制:
比如这样,当应用加载的时候显示第一页:
???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];