iOS开发核心动画之触摸手指识别

一.手势识别理论

1. UIGestureRecognizer手势识别器

利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势

UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势

2. 触摸手指类型

UITapGestureRecognizer(敲击)

UIPinchGestureRecognizer(捏合,用于缩放)

UIPanGestureRecognizer(拖拽)

UISwipeGestureRecognizer(轻扫)

UIRotationGestureRecognizer(旋转)

UILongPressGestureRecognizer(长按)

3.手势使用方法

1> 创建手势并监听

2> 添加手势

3> 实现手势方法

二. 手势识别代码

1. 点击/敲击 : UITapGestureRecognizer

1> 创建

  1. - (void)setUpTap
  2. {
  3. // 点击
  4. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
  5. [self.imageView addGestureRecognizer:tap];
  6. tap.delegate = self;
  7. }

2 > 实现方法

  1. - (void)tap:(UITapGestureRecognizer *)tap
  2. {
  3. NSLog(@"%s", __func__);
  4. }

3> 点击手势成为代理<UIGestureRecognizerDelegate>,实现shouldReceiveTouch,可设定某些范围可以点击

  1. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
  2. {
  3. // 获取当前点的位置
  4. CGPoint curP = [touch locationInView:self.imageView];
  5. if (curP.x > self.imageView.bounds.size.width * 0.5) { // 右边不可接受点击事件
  6. return NO;
  7. } else { // 左边可以接受点击事件
  8. return YES;
  9. }
  10. }

2. 捏合(放大/缩小) : UIPinchGestureRecognizer

1> 对象创建

  1. // 捏合
  2. UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
  3. pinch.delegate = self;
  4. [self.imageView addGestureRecognizer:pinch];

2> 实现监听方法 缩放属性: @property (nonatomic) CGFloat scale;

  1. - (void)pinch:(UIPinchGestureRecognizer *)pinch
  2. {
  3. // 捏合缩放
  4. self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale);
  5. // 恢复缩放
  6. [pinch setScale:1];
  7. }

3. 旋转 : UIRotationGestureRecognizer

1> 对象创建

  1. // 旋转
  2. UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
  3. rotation.delegate = self;
  4. [self.imageView addGestureRecognizer:rotation];

2> 实现监听方法 旋转属性: @property (nonatomic) CGFloat rotation;

  1. - (void)rotation:(UIRotationGestureRecognizer *)rotation
  2. {
  3. self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, rotation.rotation);
// 旋转清零
  1. [rotation setRotation:0];
  2. }

4. 拖动(移动) : UIPanGestureRecognizer

1> 对象创建

  1. // 拖动
  2. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
  3. [self.imageView addGestureRecognizer:pan];

2> 实现监听方法 注:拖动距离需要清零

  1. - (void)pan:(UIPanGestureRecognizer *)pan
  2. {
  3. // 计算拖动距离(相对于初始位置)
  4. CGPoint transP = [pan translationInView:self.imageView];
  5. self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, transP.x, transP.y);
  6. // 拖动距离请0
  7. [pan setTranslation:CGPointZero inView:self.imageView];
  8. }

5. 轻扫手势 : UISwipeGestureRecognizer

1> 对象创建

  1. // 滑动 (默认向右滑)
  2. UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
  3. // 设置滑动方向
  4. /*
  5. UISwipeGestureRecognizerDirectionRight = 右滑
  6. UISwipeGestureRecognizerDirectionLeft = 左滑
  7. UISwipeGestureRecognizerDirectionUp = 上滑
  8. UISwipeGestureRecognizerDirectionDown = 下滑
  9. */
  10. swipe.direction = UISwipeGestureRecognizerDirectionUp;
  11. [self.imageView addGestureRecognizer:swipe];

2> 实现监听方法

  1. - (void)swipe:(UISwipeGestureRecognizer *)swipe
  2. {
  3. NSLog(@"%s", __func__);
  4. }

6. 长按 : UILongPressGestureRecognizer

1> 对象创建

  1. //1.创建长按手势
  2. UILongPressGestureRecognizer *longP = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longP:)];
  3. //2.添加手势
  4. [self.imageV addGestureRecognizer:longP];

2> 实现监听方法

  1. //当手指长按的时候调用,注意当长按时,手指移动的时候,会持续调用这个方法,当手指离开时也会调用这个方法.
  2. - (void)longP:(UILongPressGestureRecognizer *)longP{
  3. /*
  4. UIGestureRecognizerStatePossible
  5. UIGestureRecognizerStateBegan = 开始长按
  6. UIGestureRecognizerStateChanged = 长按移动
  7. UIGestureRecognizerStateEnded = 长按结束
  8. UIGestureRecognizerStatePossible
  9. UIGestureRecognizerStateCancelled = 取消长按
  10. UIGestureRecognizerStatePossible
  11. UIGestureRecognizerStateFailed
  12. UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded = 长按结束
  13. */
  14. if (longP.state == UIGestureRecognizerStateBegan) {
  15. NSLog(@"开始长按");
  16. }else if(longP.state == UIGestureRecognizerStateChanged){
  17. NSLog(@"长按时移动");
  18. }else if(longP.state == UIGestureRecognizerStateEnded){
  19. NSLog(@"手指离开");
  20. }
  21. }

7. 旋转和捏合

1> 添加这2个手势,并设置代理

  1. [self setUpRotation];
  2. [self setUpPinch];

2> 实现代理方法允许多手势

  1. // 允许多触摸事件
  2. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
  3. {
  4. return YES;
  5. }
时间: 2024-11-06 08:21:27

iOS开发核心动画之触摸手指识别的相关文章

IOS开发核心动画篇---核心动画简介

iOS开发UI篇—核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量的代码就可以实现非常强大的功能. Core Animation是跨平台的,可以用在Mac OS X和iOS平台. Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程.不阻塞主线程,可以理解为在执行动画的时候还能点击(按钮). 要注意的是,Core Animation是直接作用

IOS开发核心动画篇—转场动画和组动画

iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果 属性解析: type:动画过渡类型 subtype:动画过渡方向 startProgress:动画起点(在整体动画的百分比) endProgress:动画终点(在整体动画的百分比)

iOS开发-核心动画高级编程Core Animation系列(转)

iOS-Core-Animation-Advanced-Techniques 转 GitHub译文 iOS核心动画高级编程全集 iOS-核心动画高级编程/1-图层树 iOS-核心动画高级编程/2-寄宿图 iOS-核心动画高级编程/3-图层几何学 iOS-核心动画高级编程/4-视觉效果 iOS-核心动画高级编程/5-变换 iOS-核心动画高级编程/6-专有图层 iOS-核心动画高级编程/7-隐式动画 iOS-核心动画高级编程/8-显示动画 iOS-核心动画高级编程/9-图层时间 iOS-核心动画高

ios开发核心动画七:核心动画与UIView动画的区别

/** UIView与核心动画区别?(掌握) 1.核心动画只作用在layer. 2.核心动画看到的都是假像,它并没有去修改UIView的真实位置. 什么时候使用核心动画? 1.当不需要与用户进行交互,使用核心动画 2.当要根据路径做动画时,使用核心动画:CABasicAnimation,CAKeyFrameAnimation,两个都可以根据绘制的路径UIBizerPath来绘制路径来执行动画 3.当做转场动画时, 使用核心动画 (核心动画转场类型比较多)CATrasition或是UIView的核

ios开发核心动画五:图标抖动效果--CAKeyframeAnimation

#import "ViewController.h" #define angle2Rad(angle) ((angle) / 180.0 * M_PI) @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageV; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //

iOS开发-核心动画随笔

核心动画可以让View旋转,缩放,平移(主要是操作View的layer(层)属性)但是核心动画改变的位置不是真实的位置,一切都是假象所以有时候要用到其他动画,如UIView本来封装的动画,还有定时器 // 实现图片360°旋转 CABasicAnimation* rotationAnimation; rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; rotationA

iOS开发核心动画之动画

一. 核心动画简述 1. Core Animation是直接作用在CALayer上的,并非UIView,因此核心动画的本质是修改图层的某个属性 2. 核心动画继承结构 3. transform的相关属性 二. 核心动画 基础动画 : CABaseicAnimation 帧动画 : CAKeyframeAnimation 组动画 : CAAnimationGroup 转场动画 : CATransition 1. 基础动画(CABaseicAnimation) 1> 创建动画 CABasicAnim

iOS开发核心动画之图片折叠/渐变层

1. 显示效果 2. 代码实现 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *topV; @property (weak, nonatomic) IBOutlet UIImageView *bottomV; @property (weak, nonatomic) IBOutlet UIView *touchView; /*

IOS开发核心动画六:动画组

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIView *redView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typic