UI学习笔记---第四天
事件处理
事件概述
UIEvent:事件,是由硬件捕捉的一个表示用户操作设备的对象
分三类:触摸事件\ 晃动事件\ 远程控制事件
触摸事件:会包含1个到多个触摸点
实现触摸
UIView支持触摸事件(因为继承于UIResponder),而且支持多点触摸
需要定义UIView子类,实现触摸相关的方法
touches..begin touches..moved touches..ended touches..canceled
使用触摸实现手势
手势:有规律的触摸
UITouch代表触摸在屏幕上的一根手指,可以获取触摸时间和触摸位置
如何获取touch对象,touches集合中包含了视图上的所有手势
实现触摸事件
//建工程,添加根视图控制器,根视图控制器中添加TouchView类,创建一个视图对象
//TouchView.m中代码 #import "TouchView.h" @implementation TouchView
-(void)dealloc
{
[super dealloc];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// NSLog(@"%s %d",__FUNCTION__,__LINE__);
// NSLog(@"开始");
// //获得手指(触摸)对象,UITouch类在MVC中属于M,用于存储数据,并提供了一些方法,获取这些存储的数据,存储的数据很多,例如:点击时间,点击次数,点击的位置,上一次点击位置等等,详情见UITouch API.
// UITouch *touch = [touches anyObject];
//
// //获取 手指 在 指定视图 中得位置
// CGPoint currentPoint = [touch locationInView:self.superview];
// self.center = currentPoint;
// //把CGPoint转换为NSString 并打印出来
// NSLog(@"%@",NSStringFromCGPoint(currentPoint)); // NSLog(@"%@",touch);
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
NSLog(@"移动");
//获得手指(触摸)对象,UITouch类在MVC中属于M,用于存储数据,并提供了一些方法,获取这些存储的数据,存储的数据很多,例如:点击时间,点击次数,点击的位置,上一次点击位置等等,详情见UITouch API.
UITouch *touch = [touches anyObject]; //获取 手指 在 指定视图 中得位置
CGPoint currentPoint = [touch locationInView:self.superview];
//获取手指在指定视图的上一个位置
CGPoint previousPoint = [touch previousLocationInView:self.superview];
//计算偏移点
CGPoint point = CGPointMake(currentPoint.x - previousPoint.x, currentPoint.y - previousPoint.y);
//center 在偏移后的center值
self.center = CGPointMake(self.center.x+point.x, self.center.y + point.y);
[self.superview bringSubviewToFront:self];
// self.center = point2;
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%s %d",__FUNCTION__,__LINE__);
NSLog(@"取消");
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGFloat red = arc4random()% / 255.0; //是float类型,除法运算需要加0
CGFloat green = arc4random() % / 255.0;
CGFloat blue = arc4random() % /255.0;
NSInteger width = self.frame.size.width;
NSInteger height = self.frame.size.height;
CGFloat x = arc4random()%( - width +) + width/;//center的x坐标随机
CGFloat y = arc4random()%( - width +) + height/;//center的y坐标随机 NSLog(@"%s %d",__FUNCTION__,__LINE__);
NSLog(@"结束");
self.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:];
self.center = CGPointMake(x, y); } - (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
} /*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/ @end
轻扫事件
//SwipeView.m中代码
#import "SwipeView.h" @implementation SwipeView
-(void)dealloc
{
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//设置支持多点触摸.默认是不支持的
self.multipleTouchEnabled = YES;
// Initialization code
}
return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@",touches);
UITouch *touch = [touches anyObject];
_began = [touch locationInView:self]; }
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
_end = [touch locationInView:self];
CGFloat dx = _end.x - self.began.x;
CGFloat dy = _end.y - self.began.y;
if (dx> && fabs(dy)<) {
NSLog(@"向右轻扫");
self.superview.backgroundColor = [UIColor redColor];
}else if (dx<- && fabs(dy)<)
{
NSLog(@"向左轻扫");
self.superview.backgroundColor = [UIColor orangeColor];
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{ }
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{ }
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/ @end
响应者链
由多个响应者对象组成的链
UIResponder---响应者类
iOS中所有能响应事件(触摸 晃动 . 远程事件)的对象都是响应者
系统定义了一个抽象的父类UIResponder来表示响应者.其子类都是响应者
检测触碰视图
硬件检测到触摸操作,会将信息交给UIApplication,开始检测
UIApplication -> window -> viewController -> view -> 检测所有⼦视图
最终确认触碰位置,完成响应者链的查询过程。
处理触碰事件
检测到响应者后,实现touchesBegan:withEvent:等⽅法,即处理事件。
如果响应者没有处理事件,事件会向下传递。如果没有响应者处理,则丢弃触摸事件。
事件处理的顺序与触摸检测查询相反。
触摸的⼦视图 -> view -> viewController -> window -> UIApplication
阻断响应者链
响应者链可以被打断.无法完成检测查询过程
视图类的属性:userInteractionEnabled.关闭后能阻断查询过程
是视图的属性,控制器不能使用
UI学习笔记---第四天的更多相关文章
- python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例
python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...
- X-Cart 学习笔记(四)常见操作
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 五.常见 ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- C++Primer第5版学习笔记(四)
C++Primer第5版学习笔记(四) 第六章的重难点内容 你可以点击这里回顾第四/五章的内容 第六章是和函数有关的知识,函数就是命名了的代码块,可以处理不同的情况,本章内 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- VSTO学习笔记(四)从SharePoint 2010中下载文件
原文:VSTO学习笔记(四)从SharePoint 2010中下载文件 上一次我们开发了一个简单的64位COM加载项,虽然功能很简单,但是包括了开发一个64位COM加载项的大部分过程.本次我们来给CO ...
- Python学习笔记(四)
Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...
- deepin linux学习笔记(四)进不去图形界面怎么办?
目录 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 更换成lxde桌面 进不去图形界面怎么办? 总结 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 生命不息 ...
- HTTP协议学习笔记(四)
HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...
随机推荐
- python使用urllib2抓取网页
1.使用python的库urllib2,用到urlopen和Request方法. 2.方法urlopen原形 urllib2.urlopen(url[, data][, timeout]) 其中: u ...
- 菜鸟开始学习SSDT HOOK((附带源码)
看了梦无极的ssdt_hook教程,虽然大牛讲得很细,但是很多细节还是要自己去体会,才会更加深入.在这里我总结一下我的分析过程,若有不对的地方,希望大家指出来.首先我们应该认识 ssdt是什么?从梦无 ...
- Android 应用按两下返回键退出应用程序
在android应用开发中,有时候应用会用到按两下返回键退出应用的功能,今天介绍一下这个功能,直接上代码: @Override public boolean dispatchKeyEvent(KeyE ...
- BCP 导入导出数据库数据
使用 bcp 将数据库迁移到 Azure SQL Database --所有 都是在本机sql上运行--先开启cmdshellEXEC sp_configure 'show advanced opti ...
- Hibernate xml格式和anno格式 mappedby
xml配置的时候多对一 一对多的外键可以配置一样,但是anno不太好弄,多这边配完了,一那边用个mappedby"“自己在对方的属性”就可以,不然要建一张中间表.xml的mappedby因为 ...
- Mapper类/Reducer类中的setup方法和cleanup方法以及run方法的介绍
在hadoop的源码中,基类Mapper类和Reducer类中都是只包含四个方法:setup方法,cleanup方法,run方法,map方法.如下所示: 其方法的调用方式是在run方法中,如下所示: ...
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...
- sqlserver定时备份
前言:给客户部署好系统以后,如果不加一个定时备份,总感觉心里不放心,所以一定要做定时备份,并且定时备份是很简单的 新建作业--基本信息 新建步骤 ) ),) print @filename , NOF ...
- c++父类指针强制转为子类指针后的测试(帮助理解指针访问成员的本质)(反多态)
看下面例子: #include "stdafx.h" #include <iostream> class A { //父类 public: void f() / ...
- unity3d基础02
调试: 在MonoDevelop里可以断点调试,注意绑定unity进程 使用Debug.Log()打印信息 创建游戏对象: GameObject test = GameObject.CreatePri ...