title: 实战1.2-利用手势识别器,实现视图的手势控制

知识预备

什么是仿射变换?

从视觉效果上来理解,仿射变换是通过一系列原子变换复合而来的变换。包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)(图像的错切实际上是平面景物在投影平面上的非垂直投影)。

iOS 视图的 frame 和 bounds 属性的区别

frame 描述了该视图在父视图坐标系统中的位置和大小,其参照点是父视图的坐标系统。

bounds 描述了该视图在本地坐标系统中的位置和大小,其参照点是该视图自己的坐标系统。

示例

如果还有疑惑,可以点击下方链接,这篇博文确切地解释了区别所在。

iOS 视图的 frame 和 bounds 属性的区别

3.UIGestureRecognizerState 的参数值(状态)

UIGestureRecognizerStatePossible : 手势识别器还没有识别出手势,但是可能正在估算触摸事件(touches event),还处在判断阶段。这个状态是手势识别器的默认状态。

UIGestureRecognizerStateBegan : 手势识别器已经接收到了一系列触摸并且识别出了它属于哪个手势。响应方法在下一个运行周期被调用。

UIGestureRecognizerStateChanged : 手势识别器已经接收到了一系列触摸并且识别出手势发生了改变。响应方法在下一个运行周期被调用。

UIGestureRecognizerStateEnded : 手势识别器已经接收到了一系列触摸并且识别出手势刚刚结束。响应方法在下一个运行周期被调用,并且把手势状态的值重新置为 UIGestureRecognizerStatePossible。

UIGestureRecognizerStateCancelled : 手势识别器已经接收到了一系列触摸并且识别出手势突然中断。响应方法在下一个运行周期被调用,并且把手势状态的值重新置为 UIGestureRecognizerStatePossible。

UIGestureRecognizerStateFailed : 手势识别器已经接收到了一系列多点触控,但是与识别器认识的手势匹配失败(识别不出来)。无响应方法。把手势状态的值重新置为 UIGestureRecognizerStatePossible。

UIGestureRecognizerStateRecognized : 手势识别器已经接收到了一系列多点触控,并且识别器识别出该手势。响应方法在下一个运行周期被调用,并且把手势状态的值重新置为 UIGestureRecognizerStatePossible。

实战

创建工程步骤请参照 实战1中的前几步。

在工程中创建一个 MyImageView 视图类,继承自 UIImageView。

首先为我们创建的视图类进行初始化方法的编写,在 MyImageView.m 文件中:

static int count;

@implementation MyImageView {

CGPoint previousLocation;

UIPanGestureRecognizer *panGestureRecognizer;

}

#pragma mark - initialization

- (id) initWithImage:(UIImage *)image {

self = [super initWithImage:image];

if (self) {

self.userInteractionEnabled = YES;

// 在视图被初始化的过程中,创建一个 拖动手势识别器

// 应用 target-action 模式,以该类为目标对象,如果手势被触发,handlePan: 方法会被调用

panGestureRecognizer = [[UIPanGestureRecognizer alloc]

initWithTarget:self action:@selector(handlePan:)];

// 该类的实例对象能够被 拖动手势识别器 所识别

self.gestureRecognizers = @[panGestureRecognizer];

}

return self;

}

- (id) init {

// 图片文件的名称为 blue.png

return [self initWithImage:[UIImage imageNamed:@"blue"]];

}

#pragma mark - touches mothods are called

// 当该类的实例对象被触碰的时候,该方法会被触发

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

[self.superview bringSubviewToFront:self];

// 视图中心点

previousLocation = self.center;

}

#pragma mark - selector handlePan:

- (void) handlePan:(UIPanGestureRecognizer *) gestureRecognizer {

// print 该方法的运行次数

NSLog(@"%i", ++count);

// 根据视图的仿射变换来获取偏移量

CGPoint translation = [gestureRecognizer translationInView:self.superview];

// 重置视图中心点

self.center = CGPointMake(previousLocation.x + translation.x, previousLocation.y + translation.y);

}

在 ViewController.h 文件中声明属性:

@class MyImageView;

@interface ViewController : UIViewController

@property (nonatomic, strong) MyImageView *myImageView;

在 ViewController.m 文件中导入头文件(#import "MyImageView.h")并写入代码:

- (void)viewDidLoad {

[super viewDidLoad];

// 创建类实例并且添加视图

_myImageView = [[MyImageView alloc] initWithImage:[UIImage imageNamed:@"blue"]];

[self.view addSubview:_myImageView];

}

运行结果: 视图能够响应拖动手势,在屏幕上被拖动。控制台显示结果标明, handlePan: 方法在拖动手势进行过程中,一直都在被调用,直至手势停止。

console

总结:

** 为了让自定义视图能够响应手势,我们在创建并且初始化视图类实例的时候,就应该创建响应的手势识别器及其会响应的方法,当手势在进行过程中时,响应方法被反复调用,直至手势停止。为了让视图能够跟随手势移动,我们只需根据视图先前的中心位置和被拖动以后的偏移位置来重新设定视图的中心位置即可。

**

python手势识别控制幻灯片翻页系统_实战1.2-利用手势识别器,实现视图的手势控制...相关推荐

  1. python手势识别控制幻灯片翻页系统_基于Emgu CV 的手势识别实现PPT的控制放映

    Emgu CV 简介 众所周知,Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV.开发者可以很方便的通过C#,VB等语言调用OpenCV函数来实现相应的图像 ...

  2. 一种语音控制PPT翻页系统的制作方法

    本实用新型属于智能语音领域,特别是涉及一种语音控制PPT翻页系统. 背景技术: 随着计算机技术.投影技术和网络技术的发展,各行各业的工作已经离不开计算机的参与.多媒体演示已经受到了人们的广泛应用.而多 ...

  3. python翻页_如何用python tkiner实现图片翻页功能

    如何用python tkiner实现图片翻页功能 发布时间:2020-06-26 12:52:59 来源:亿速云 阅读:108 作者:Leah 如何用python tkiner实现图片翻页功能?针对这 ...

  4. Java电子书平滑翻页效果_移动端页面平滑翻页的解决方案

    随着近几年移动营销页的火爆,催生了一个中国式的名词「H5」.而 H5 最常见的形态就是类似幻灯片翻页效果. 我们需要制作 H5 的时候,最快的办法就是使用一些滑动插件库,如 iDangero.us 出 ...

  5. Python自动化开发基础 分布式监控系统开发实战 day8-李杰-专题视频课程

    Python自动化开发基础 分布式监控系统开发实战 day8-10994人已学习 课程介绍         从0基础开始讲解Python语法.流程控制.函数式编程.面向对象开发等重要的Python开发 ...

  6. python 爬虫系统_实战干货:从零快速搭建自己的爬虫系统

    近期由于工作原因,需要一些数据来辅助业务决策,又无法通过外部合作获取,所以使用到了爬虫抓取相关的数据后,进行分析统计.在这个过程中,也看到很多同学爬虫相关的文章,对基础知识和所用到的技术分析得很到位, ...

  7. Java电子书平滑翻页效果_(转载)Android 平滑和立体翻页效果1

    Android 平台提供了一套完整的动画框架,使得开发者可以用它来开发各种动画效果,本文将向读者阐述 Android 的动画框架是如何实现的.任何一个框架都有其优势和局限性,只有明白了其实现原理,开发 ...

  8. [Python Scrapy爬虫] 二.翻页爬取农产品信息并保存本地

    前面 "Python爬虫之Selenium+Phantomjs+CasperJS" 介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分 ...

  9. creator 数字翻页效果_用好这款Fliqlo翻页时钟屏保让你电脑瞬间提升逼格和幸福感!...

    ?本文共计:2088字·⏰阅读时长:6分钟 ?目录预览 -------------- ① 电脑屏幕保护有啥? ② Fliqlo的基本介绍 ③ Fliqlo不同系统的使用教程 + Mac OS系统的使用 ...

最新文章

  1. 资源 | 吴恩达《机器学习训练秘籍》中文版58章节完整开源
  2. LVS+keepalived 实现高可用与负载均衡实施方案
  3. neo4j导入两个文件_Neo4j:找到两个纬度/经度之间的中点
  4. 笔记本win10玩红警黑屏_【买笔记本电脑差评真的有参考意义?】
  5. pl/sql 测试函数_如何在SQL单元测试中使用伪函数?
  6. 重大活动网络攻击面前,京东智联云的攻防之道
  7. FLEX4 在组件中自定义ToolTip样式
  8. 计算机中的进制位运算
  9. 华为音量键只能调通话_华为手机音量键的隐藏功能,知道一个就会好用不少!...
  10. 智慧城管数字孪生IOC系统
  11. Drools4.0官方使用手册中文
  12. Java实现学生成绩分析系统
  13. C# 随机生成名字,电话,图像
  14. 武汉大学计算机学院期末考试安排,【通知】关于2019-2020学年第一学期期末考试工作安排的通知...
  15. Python数据处理DataFrame小记
  16. Python实现问卷星调查问卷自动填写
  17. iOS 芝麻认证开发(跳转本地的支付宝进行认证开发)
  18. leetCode1103
  19. Manifest merger failed : Attribute meta-data#android.support.VERSION@value..
  20. 人工智能以及图形图像处理领域CCFA类期刊汇总与个人评价

热门文章

  1. 简谈 SDRAM的工作原理
  2. RTP协议介绍以及C语言实现具有发送H.264视频功能的RTP服务器
  3. 【填坑】 GLSurfaceView surfaceCreated不回调 以及在Native中ANativeWindow_lock 获取缓存失败 返回 -22
  4. 数据存储的四种常见方式
  5. 财务自由之路 笔记 第十二章-财务保障、财务安全
  6. 学习SOA前的几点寻思
  7. 光耦隔离继电器驱动模块设计以及单片机的使用
  8. 为何选择年前加盟vr全景项目?有你想不到的优势
  9. 一款名为VirLock的敲诈者病毒来袭
  10. Qt USB HID通讯