IOS 七种手势详解(动图+Demo下载)
来源:互联网 发布:淘宝客鹊桥计划是什么 编辑:程序博客网 时间:2024/06/03 14:51
原创Blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的博客专栏,这个关于IOS SDK的专栏我会持续更新
IOS SDK详解
前言:
触摸是交互的核心,而手势是触摸的上层封装,易于使用,不易出错。本文介绍了7种常用手势,多数手势我都配合Core Animation举了一个例子。给读者一些参考。最后,Demo的链接我会放到最后。
Demo源代码下载
CSDN下载
GitHub下载
一 UIGestureRecognizer
UIGestureRecognizer是一个抽象类,定义了手势所需的一些基本的属性和方法。当然,也可以自定义自己的手势,近期不会更新相关文章,所以不在本文的考虑范畴。七种子类是常用的也是IOS SDK提供的类。
UITapGestureRecognizerUIPinchGestureRecognizerUIRotationGestureRecognizerUISwipeGestureRecognizerUIPanGestureRecognizerUIScreenEdgePanGestureRecognizerUILongPressGestureRecognizer
一些常用的方法
位置信息
获得触摸的位置- (CGPoint)locationInView:(UIView *)view
获得某一个触摸的位置- (CGPoint)locationOfTouch:(NSUInteger)touchIndex inView:(UIView *)view
当前手势有几个触摸- (NSUInteger)numberOfTouches
State
这个很重要,因为要通过State来判断手势的情况@property(nonatomic, readwrite) UIGestureRecognizerState state
绑定手势的view@property(nonatomic, readonly) UIView *view
取消或者延迟
@property(nonatomic) BOOL cancelsTouchesInView@property(nonatomic) BOOL delaysTouchesBegan@property(nonatomic) BOOL delaysTouchesEnded
两个手势之间关系
- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer
二 UITapGestureRecognizer
Demo的效果图-tap一下,图片抖动
第一个手势,我在storyboard上添加
然后,在响应手势的函数中添加动画
- (IBAction)tap:(UITapGestureRecognizer *)sender { CAKeyframeAnimation * animation = [CAKeyframeAnimation animation]; animation.keyPath = @"position.x"; NSInteger initalPositionX = self.imageview.layer.position.x; animation.values = @[@(initalPositionX), @(initalPositionX + 10), @(initalPositionX - 10), @(initalPositionX + 10), @(initalPositionX)]; animation.keyTimes = @[ @(0), @(1/6.0), @(3/6.0), @(5/6.0), @(1)]; animation.removedOnCompletion = YES; [self.imageview.layer addAnimation:animation forKey:@"keyFrame"];}
属性和方法介绍
@property(nonatomic) NSUInteger numberOfTapsRequired //手势需要tap几下
@property(nonatomic) NSUInteger numberOfTapsRequired //手势需要几根手指
三 UIPinchGestureRecognizer
效果如-pinch则放大图片
实现代码
-(void)viewWillAppear:(BOOL)animated{ CGRect imageFrame; //按照设备的不同调整大小 if ([[UIDevice currentDevice].model isEqualToString:@"ipad"]) { imageFrame = CGRectMake(0,0,300,200); }else { imageFrame = CGRectMake(0,0,240,160); } self.imageview = [[UIImageView alloc] initWithFrame:imageFrame]; self.imageview.image = [UIImage imageNamed:@"Image3.jpg"]; self.imageview.center = self.view.center; [self.view addSubview:self.imageview]; [self.imageview setUserInteractionEnabled:YES]; //绑定手势 UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)]; [self.imageview addGestureRecognizer:pinch]; self.isLargeView = NO; self.oldFrame = self.imageview.frame;}-(void)pinch:(UIPinchGestureRecognizer *)pinch{ if (pinch.state == UIGestureRecognizerStateRecognized) { if (!self.isLargeView && pinch.velocity > 0) { self.backgroundView = [[UIView alloc] initWithFrame:self.view.frame]; self.backgroundView.backgroundColor = [UIColor blackColor]; self.backgroundView.alpha = 0.0; self.imageview.backgroundColor = [UIColor blueColor]; [self.view insertSubview:self.backgroundView belowSubview:self.imageview]; [UIView animateWithDuration:0.8 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.backgroundView.alpha = 1.0; if ([[UIDevice currentDevice].model isEqualToString:@"ipad"]) { self.imageview.frame = CGRectMake(0,300,768,512); }else { self.imageview.frame = CGRectMake(0,220,320,210); } } completion:^(BOOL finished) { self.isLargeView = YES; }]; } if (self.isLargeView && pinch.velocity < 0) { [UIView animateWithDuration:0.8 animations:^{ self.backgroundView.alpha = 0.0; self.imageview.frame = self.oldFrame; } completion:^(BOOL finished) { [self.backgroundView removeFromSuperview]; self.backgroundView = nil; self.isLargeView = NO; }]; } }}
属性和方法介绍
@property(nonatomic) CGFloat scale //scale的绝对值(相对最初的距离)
@property(nonatomic, readonly) CGFloat velocity //速度
四 UIRotationGestureRecognizer
效果如图-旋转
实现代码
-(void)viewDidLoad{ self.imageview.userInteractionEnabled = YES; UIRotationGestureRecognizer * rotate = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; [self.imageview addGestureRecognizer:rotate];}-(void)rotate:(UIRotationGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateChanged) { self.imageview.transform = CGAffineTransformMakeRotation(sender.rotation); }}
属性和方法介绍
@property(nonatomic) CGFloat rotation //旋转的绝对值(相对最初)
@property(nonatomic, readonly) CGFloat velocity //速度
五 UISwipeGestureRecognizer
效果如图-翻页
实现代码
-(void)viewDidLoad{ UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; swipe.numberOfTouchesRequired = 2; [swipe setDirection:UISwipeGestureRecognizerDirectionUp]; [self.containview addGestureRecognizer:swipe]; self.image2.userInteractionEnabled = YES; self.image2.hidden = YES; self.image3.userInteractionEnabled = YES; self.image3.hidden = NO;}-(void)swipe:(UISwipeGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateRecognized) { [UIView transitionWithView:self.containview duration:0.8 options:UIViewAnimationOptionTransitionCurlUp animations:^{ self.image3.hidden = !self.image3.hidden; self.image2.hidden = !self.image2.hidden; } completion:^(BOOL finished) { }]; }}
属性和方法介绍
@property(nonatomic) UISwipeGestureRecognizerDirection direction //方向
@property(nonatomic) NSUInteger numberOfTouchesRequired //需要的触摸(手指)数量
六 UIPanGestureRecognizer
效果如图-拖动图片随着移动,停止后回到原始位置
实现代码
-(void)viewDidLoad{ CGRect imageFrame; if ([[UIDevice currentDevice].model isEqualToString:@"ipad"]) { imageFrame = CGRectMake(0,0,300,200); }else { imageFrame = CGRectMake(0,0,240,160); } self.imageview = [[UIImageView alloc] initWithFrame:imageFrame]; self.imageview.image = [UIImage imageNamed:@"Image3.jpg"]; self.imageview.center = self.view.center; [self.view addSubview:self.imageview]; UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; self.imageview.userInteractionEnabled = YES; [self.imageview addGestureRecognizer:pan]; self.initalCenter = self.imageview.center;}-(void)pan:(UIPanGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateBegan) { }else if(sender.state == UIGestureRecognizerStateChanged){ CGPoint translation = [sender translationInView:self.view]; self.imageview.center = CGPointMake(self.initalCenter.x + translation.x,self.initalCenter.y + translation.y); }else{ [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ self.imageview.center = self.initalCenter; } completion:^(BOOL finished) { }]; }}
属性方法介绍@property(nonatomic) NSUInteger maximumNumberOfTouches //手势所需的最大手指数@property(nonatomic) NSUInteger minimumNumberOfTouches //手势所需的最小手指数- (CGPoint)translationInView:(UIView *)view //在view中移动的距离- (CGPoint)velocityInView:(UIView *)view //移动速度
七 UIScreenEdgePanGestureRecognizer
效果如图-实现简单的侧拉效果
实现代码
-(void)viewDidLoad{ UIScreenEdgePanGestureRecognizer * edge = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(edgePan:)]; edge.edges = UIRectEdgeRight; [self.view addGestureRecognizer:edge];}-(void)edgePan:(UIScreenEdgePanGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateBegan) { self.edgeView = [[UIView alloc] initWithFrame:CGRectOffset(self.view.frame,CGRectGetWidth(self.view.frame),0)]; self.edgeView.backgroundColor = [UIColor blueColor]; self.offsetCenter = self.edgeView.center; [self.view addSubview:self.edgeView]; }else if(sender.state == UIGestureRecognizerStateChanged){ CGPoint translation = [sender translationInView:self.view]; self.edgeView.center = CGPointMake(self.offsetCenter.x + translation.x,self.offsetCenter.y); }else if(sender.state == UIGestureRecognizerStateEnded) { if ([sender velocityInView:self.view].x < 0) { [UIView animateWithDuration:0.3 animations:^{ self.edgeView.center = self.view.center; }]; }else{ [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.edgeView.center = self.offsetCenter; } completion:^(BOOL finished) { [self.edgeView removeFromSuperview]; self.edgeView = nil; }]; } }else{ [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ self.edgeView.center = self.offsetCenter; } completion:^(BOOL finished) { [self.edgeView removeFromSuperview]; self.edgeView = nil; }]; }}
属性和方法介绍@property(readwrite, nonatomic, assign) UIRectEdge edges //哪些边缘添加edgePan
八 UILongPressGestureRecognizer
效果如图-长按删除图片
实现代码
-(void)viewDidLoad{ self.imageview.userInteractionEnabled = YES; UILongPressGestureRecognizer * longpress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longpress:)]; longpress.minimumPressDuration = 0.5; longpress.numberOfTapsRequired = 0; longpress.cancelsTouchesInView = YES; longpress.delegate = self; [self.imageview addGestureRecognizer:longpress];}-(void)longpress:(UILongPressGestureRecognizer *)sender{ if (sender.state == UIGestureRecognizerStateBegan){ UIAlertView * alertview = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Delete this image?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil]; [alertview show]; [sender cancelsTouchesInView]; }}-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ if (buttonIndex == 1) { [UIView animateWithDuration:1.0 delay:0.0 options:0 animations:^{ self.imageview.alpha = 0.0; } completion:^(BOOL finished) { [self.imageview removeFromSuperview]; }]; } self.imageview.userInteractionEnabled = YES;}
属性和方法介绍@property(nonatomic) CFTimeInterval minimumPressDuration //手势识别的最小按压时间@property(nonatomic) NSUInteger numberOfTouchesRequired //几根手指@property(nonatomic) NSUInteger numberOfTapsRequired //识别手势需要的预先点击数目,通常为0@property(nonatomic) CGFloat allowableMovement //允许移动的距离
- IOS 七种手势详解(动图+Demo下载)
- IOS 七种手势详解(动图+Demo下载)
- ios 七种手势详解
- iOS七种手势
- ios-手势总结demo
- iOS录音方法实用详解(配Demo下载)
- iOS 两种预览使用详解(配Demo下载)( Quicklook& UIDocumentInteractionController)
- iOS UIGestureRecognizer(手势操作)~demo
- IOS实景(GIF动图和视频)播放以及AR识别Demo分享
- IOS实景(GIF动图和视频)播放以及AR识别Demo分享
- iOS 六种手势详解 UIGestureRecognizer
- IOS手势使用详解
- IOS中的手势详解
- iOS中的手势详解
- IOS手势解锁详解
- IOS AutoLayout详解(三)用代码实现(附Demo下载)
- IOS AutoLayout详解(三)用代码实现(附Demo下载)
- IOS AutoLayout详解(三)用代码实现(附Demo下载)
- Unity3D 高通增强现实的动画实现
- epoll
- eclipse装adt
- Hibernate工作原理及开发步骤
- Think in Java(十四):容器深入研究
- IOS 七种手势详解(动图+Demo下载)
- leetcode Valid Parentheses
- [BZOJ 1064][NOI 2008]假面舞会(图论+BFS)
- Cocos2d-x 3.2 onEnter与onEnterTransitionDidFinish的区别
- 黑马程序员--06OC类和对象
- poj 1330 Nearest Common Ancestors
- Codeforces 337E Divisor Tree 暴搜
- BZOJ 3833 [POI 2014] Solar Lamps 解题报告
- Java并发的四种风味:Thread、Executor、ForkJoin和Actor