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. oracle11g程序调优纪实
  2. Python 国际化
  3. 【Flutter】底部导航栏实现 ( BottomNavigationBar 底部导航栏 | BottomNavigationBarItem 导航栏条目 | PageView )
  4. 计算机工程与科学电话,【计算机工程与科学杂志社】计算机工程与科学杂志社编辑部...
  5. html5水调歌头代码,张惠言的五首《水调歌头》
  6. db2查询表结构语句_常用的sql语句集合(适合数据库初级人员)
  7. c与指针 从一个字符串中提取子串_python实现找出来一个字符串中最长不重复子串...
  8. 明天要去面试...........
  9. java URI 编码解码
  10. c代码格式化_Python 只用一行代码,可以实现哪些事儿?
  11. 游戏开发之C++类中的static、const梳理总结(C++基础)
  12. 局域网 访问计算机 软件,局域网共享软件
  13. 3904三极管是什么功能_新方法讲解三极管工作原理
  14. 实战录 | 前端性能优化二三事儿
  15. java pem 读取_PEM_密钥对生成与读取方法
  16. fabs在python中是什么意思_Python fabs() 与 abs() 区别是什么?
  17. 二级考试c语言中 星号与字母 题型总结,计算机等级C语言上机考试编程题分类总结.doc...
  18. PHP红包搭建步骤,PHP 生成微信红包代码简单
  19. photon 服务器操作系统,PhotonServer游戏服务器端教程
  20. doubb超时_dubbo源码分析(二):超时原理以及应用场景

热门文章

  1. 滴答定时器的计数模式_系统滴答定时器
  2. 视频全程回放 | 2018贵阳数博会 - 央视对话栏目:《把脉区块链》
  3. HDU 1811 Rank of Tetris
  4. ZigBee协议栈广播
  5. 1 0.99999的悖论_李鸿仪.不存在的罗素悖论Russell’s paradox that does not exist
  6. MySql java.sql.SQLException: sql injection violation, part alway false condition not allow异常简单处理方式
  7. android安卓SurfaceView与view的区别是什么?
  8. Big O Notation
  9. 娱乐项目————打豆豆
  10. WAN技术-1广域网接口