各种手势的总结

首先该ViewController 要遵守手势的协议

@interface ViewController () <UIGestureRecognizerDelegate>

{

UIImageView *_imageView;

}

常用的手势

/*

UITapGestureRecognizer Tap(点击)

UIPinchGestureRecognizer Pinch(捏合/二指往內或往外拨动)

UIRotationGestureRecognizer Rotation(旋转)

UISwipeGestureRecognizer Swipe(滑动,快速移动)

UIPanGestureRecognizer Pan (拖移,慢速移动)

UILongPressGestureRecognizer LongPress(长按)

*/

//alt/option 会出现两个手指 在模拟器

- (void)creatView{

_imageView = [[UIImageView alloc] initWithFrame:CGRectMake(60, 100, 200, 300)];

_imageView.image = [UIImage imageNamed:@"girl.jpg"];

//想让_imageView能和用户交互 比如点击 旋转等等 那么这时

//第一步必须打开用户交互

_imageView.userInteractionEnabled = YES;

//然后再增加手势就可以

[self.view addSubview:_imageView];

}

一、滑动手势的使用

#pragma mark - 滑动

- (void)creatGuesture5 {

//滑动手势  2048

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeClick:)];

//设置方向

swipe.direction = UISwipeGestureRecognizerDirectionLeft;

/*

UISwipeGestureRecognizerDirectionRight 向右滑动

UISwipeGestureRecognizerDirectionLeft

UISwipeGestureRecognizerDirectionUp

UISwipeGestureRecognizerDirectionDown

*/

//一个手势只能设置一个方向,四个方向都有滑动手势,必须创建四个滑动手势

[_imageView addGestureRecognizer:swipe];

[swipe release];

}

- (void)swipeClick:(UISwipeGestureRecognizer *)swipe {

NSLog(@"滑动");

switch (swipe.direction) {

case UISwipeGestureRecognizerDirectionLeft:

{

NSLog(@"左滑动");

}

break;

case UISwipeGestureRecognizerDirectionRight:

{

NSLog(@"右滑动");

}

break;

case UISwipeGestureRecognizerDirectionUp:

{

NSLog(@"上滑动");

}

break;

case UISwipeGestureRecognizerDirectionDown:

{

NSLog(@"下滑动");

}

break;

default:

break;

}

}

//2048 的滑动

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

{

UILabel *_label;

}

- (void)dealloc{

[_label release];

[super dealloc];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

// Custom initialization

}

return self;

}

- (void)creatLabel{

_label = [[UILabel alloc] initWithFrame:CGRectMake(110, 100, 100, 100)];

_label.text = @"2";

_label.layer.masksToBounds = YES;

_label.layer.cornerRadius = 5;

_label.textAlignment = NSTextAlignmentCenter;

_label.backgroundColor = [UIColor redColor];

[self.view addSubview:_label];

}

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view.

[self creatLabel];

UISwipeGestureRecognizerDirection num[4] = {

UISwipeGestureRecognizerDirectionRight,

UISwipeGestureRecognizerDirectionLeft,

UISwipeGestureRecognizerDirectionUp,

UISwipeGestureRecognizerDirectionDown

};

//创建四个方向的滑动手势

for (int i = 0; i < 4; i++) {

//创建一个滑动手势

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];

//设置手势方向

swipe.direction = num[i];

//给当前界面增加滑动手势

[self.view addGestureRecognizer:swipe];

[swipe release];

}

}

//当手指在屏幕上 上下左右滑动时候会触发这个函数

- (void)swipe:(UISwipeGestureRecognizer *)sw{

switch (sw.direction) {//手势的方向

//向右滑动

case UISwipeGestureRecognizerDirectionRight:

{

_label.center = CGPointMake(_label.center.x+100, _label.center.y);

}

break;

//向左滑动

case UISwipeGestureRecognizerDirectionLeft:

{

_label.center = CGPointMake(_label.center.x-100, _label.center.y);

}

break;

//向上滑动

case UISwipeGestureRecognizerDirectionUp:

{

_label.center = CGPointMake(_label.center.x, _label.center.y-100);

}

break;

//向下滑动

case UISwipeGestureRecognizerDirectionDown:

{

_label.center = CGPointMake(_label.center.x, _label.center.y+100);

}

break;

default:

break;

}

}

二、旋转、捏合、点击

#pragma mark - 手势协议

//是否允许 两个手势同时有效 (代理的方法)

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

NSLog(@"%@-%@",[gestureRecognizer class],[otherGestureRecognizer class]);

return YES;

}

#pragma mark - 旋转手势

- (void)creatGuesture3 {

UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationClick:)];

//设置代理 (如果要两个手势同时有效) 旋转和捏合 同时有效

rotation.delegate = self;

[_imageView addGestureRecognizer:rotation];

[rotation release];

}

//旋转过程中一直调用

- (void)rotationClick:(UIRotationGestureRecognizer *)rotation {

NSLog(@"r:%f",rotation.rotation);//手势旋转的角度

//每次都是相对 当前的 旋转 (当前的都是参照物)

_imageView.transform = CGAffineTransformRotate(_imageView.transform, rotation.rotation);

//相对的弧度应该重置为0

rotation.rotation = 0;

}

#pragma mark - 捏合手势

- (void)creatGuesture2 {

//捏合手势 两个手指

UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchClick:)];

//设置代理 (如果要两个手势同时有效)

pinch.delegate = self;

[_imageView addGestureRecognizer:pinch];

[pinch release];

}

//只要捏合就会一直调用

- (void)pinchClick:(UIPinchGestureRecognizer *)pinch {

NSLog(@"捏合%f",pinch.scale);

//可以进行 缩放

//pinch.scale获取手势的比例

//相当于最原始的

//_imageView.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);

//相对对当前的_imageView.transform

_imageView.transform = CGAffineTransformScale(_imageView.transform, pinch.scale, pinch.scale);

//把手势比例重置为1 应该每次都是相对的

pinch.scale = 1;

}

#pragma mark - 点击手势

- (void)creatGuesture1 {

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapClick:)];

//设置 点击次数(1表示单击 2 表示双击)

tap.numberOfTapsRequired = 2;

//设置手指的个数

tap.numberOfTouchesRequired = 1;

//UIGestureRecognizer 所有手势的父类

//把手势加到图片视图

[_imageView addGestureRecognizer:tap];

[tap release];

}

- (void)tapClick:(UITapGestureRecognizer *)tap {

NSLog(@"点击手势");

}

三、拖动、拖拽手势

#pragma mark - 移动/拖拽

- (void)creatGuesture4 {

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panClick:)];

[_imageView addGestureRecognizer:pan];

[pan release];

}

- (void)panClick:(UIPanGestureRecognizer *)pan {

//获取 拖拽手势相对于self.view 的 偏移量

CGPoint curPoint = [pan translationInView:self.view];

NSLog(@"%@",NSStringFromCGPoint(curPoint));

CGPoint center = _imageView.center;

center.x += curPoint.x;

center.y += curPoint.y;

_imageView.center = center;

//把偏移量 重新设置为0  CGPointZero表示 0 0

[pan setTranslation:CGPointZero inView:self.view];

}

四、长按手势

#pragma mark - 长按手势

- (void)creatGuesture6 {

// 长按 删除 / 语音

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pressClick:)];

[_imageView addGestureRecognizer:longPress];

[longPress release];

}

- (void)pressClick:(UILongPressGestureRecognizer *)longPress {

NSLog(@"长按");

//会触发两次 一个长按开始的时候 还有就是长按结束的时候

//我们要处理这种现象

//UIGestureRecognizerStateBegan //开始

//UIGestureRecognizerStateEnded 结束

if (longPress.state == UIGestureRecognizerStateBegan) {

NSLog(@"长按开始");

}

}

时间: 2024-10-07 06:32:43

各种手势的总结的相关文章

vue手势解决方案

1.需求 因为项目中要做一个可以移动.旋转和放缩具有合成图片的功能,例如: 剑可以随意移动,然后把位移.旋转角度和放缩值传给后台进行合成. 2.解决方案 网上搜到手势插件AlloyFinger,https://github.com/AlloyTeam/AlloyFinger 首先安装AlloyFinger:npm install alloyfinger 然后在Vue文件里面引用:import AlloyFinger from 'alloyfinger' 使用方法: mounted() { thi

手势事件

1.基本的手势事件主要有如下三个方法: dispatchTouchEvent : 判断该事件是否需要下发.返回true表示需要下发给下级视图,返回false表示不需要下发(交给自身的onTouchEvent处理).但是否最终下发,还需根据onInterceptTouchEvent的拦截结果. onInterceptTouchEvent : 判断当前容器是否需要拦截该事件.返回true表示予以拦截(交给自身的onTouchEvent处理).不放给下级视图,返回false表示不拦截该事件. onTo

【Bootstrap】3.优化站点资源、完成响应式图片、让传送带支持手势

A.优化站点资源 速度很重要.用户很关心.我们的站点必须加载够快,否则用户就会走人.SEO 也很重要.我们的站点必须加载够快,否者搜索排名就会下降. 明白了这样,我们就来清点一下 [Bootstrap]2.作品展示站点 中的资源.特别的,来看一看我们能控制的.影响页面速度的重要因素 —— 文件大小,包括图片.CSS和 JavaScript 文件.只要简单几步,我们就可以给这些文件“瘦身”,缩短加载时间. A.1 优化图片 这些图片都通过 Photoshop 的 “保存为 Web 格式” 进行了一

Android官方开发文档Training系列课程中文版:手势处理之滚动动画及Scroller

原文地址:http://android.xsoftlab.net/training/gestures/scroll.html 在Android中,滑动经常由ScrollView类来实现.任何超出容器边界的布局都应该将自己内嵌在ScrollView中,以便提供可滚动的视图效果.自定义滚动只有在特定的场景下才会被用到.这节课将会描述这样一种场景:使用scroller显示一种可滚动的效果. 你可以使用Scroller或者OverScroller来收集一些滑动动画所需要的数据.这两个类很相似,但是Ove

九点(九宫格)式手势解锁自定义view

周末闲着没事,写了个手势解锁的view,实现起来也蛮快的,半天多一点时间就完事.把源码和资源贴出来,给大家分享,希望对大家有用. 效果,就跟手机上的九点手势解锁一样,上个图吧: 过程嘛感觉确实没啥好讲的了,涉及的知识以前的博客都说过了,无非就是canva,paint,touch事件这些,画画圆圈画画线条,剩下的就是细节处理逻辑了.都在代码里,所以这里就主要是贴资源吧. 这个自定义view就一个类,源码如下: package com.cc.library.view; import android.

UIKit框架(16)手势识别器

UIGestureRecognizer 利用手势识别器,能够轻松识别用户在某个view上面做一些常见的手势 UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势 UITapGestureRecognizer                敲击 UIPinchGestureRecognizer            捏合手势 UIPanGestureRecognizer               拖拽 UISwipeGestureRecog

2015-10-31 iOS 中的手势

UIkit框架中绝大多数的控件都是继承自,UIResponder类,UIResponder 类有强大的处理触摸事件的能力.假如一个UIview 收到一个触摸事件,那么这个触摸事件就会去进行寻找相应的响应事件,如果在该UIview 中找不到,就寻找UIView的对象去处理,如果UIView对象没有权利处理,就往当前的上一层UIViewController去寻找,如果找不到就再寻找 UIViewController 的对象去处理,如果这个对象仍然不能处理,就再往上层 UIWindow 对象去处理,如

iOS开发——仿Clear纯手势操作的UITableView

前言 在Clear应用中,用户无需任何按钮,纯靠不同的手势就可以完成对ToDoItem的删除.完成.添加.移动.具体来说,功能上有左划删除,右划完成,点击编辑,下拉添加.捏合添加.长按移动.这里将这些功能实现并记录. 左划删除与右划完成 所谓的左右滑动,就是自定义一个cell然后在上面添加滑动手势.在处理方法中计算偏移量,如果滑动距离超过cell宽度一半,就删除它,或者是为文本添加删除线等来完成它:如果没有超过一半,那么就用动画把cell归位. 效果图如下: 关键代码如下: - (void)ha

iOS小米遥控器的手势监听及UI实现

这篇文章通过实例实现了一个类似小米手势遥控器的功能页面. 效果图如下所示: 触摸事件的响应通过对系统的触摸实践监听来进行. 通过一个数组来对点的集合进行缓存和分析. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.allowsInteraction) return; UITouch *touch = [touches anyObject]; CGPoint start = [touch lo

带有ListView的界面无法通过手势左右滑动切换界面问题解决办法

问题描述: 在做OnGestureListener滑动切换窗口的时候,会遇到这样的问题.就是当界面中含有ListView的时候,OnGestureListener的左右触屏滑动就被ListView自己吃掉了. 问题分析: 在Android系统中,事件的分发和响应都按照一定的优先级仅仅有条的进行着.如果Activity中包含ListView那么系统的onTouchEvent事件会优先分发给ListView去处理,这时ListView的OnItemClickListener监听器会优先响应onTou