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.用单台虚拟主机实现多个域名 ...
随机推荐
- js基础之arguments、css
arguments就是一个包含传入的参数的数组对象 栗子一: function sum(){ var result=0; for(var i=0;i<arguments.length;i++){ ...
- bzoj 2324: [ZJOI2011]营救皮卡丘
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...
- 一模 (1) day2
第一题:(水题) 题目大意:就是给出扫雷的图,然后统计每个九宫格的雷的个数. 解题过程: 1.好久没做这样的水题了.直接模拟水过.. 第二题: 题目大意:给出一个长度小于1000的数k,要求一个尽可能 ...
- uboot启动内核(3)
nand read.jffs2 0x30007FC0 kernel; 从NAND读出内核:从哪读,从kernel分区 放到哪去 -0x30007FC0 nand read.jffs2 0x3000 ...
- io函数
io函数一般分为两大类: 系统(不带缓存)调用: 如read.write.open 标准(带缓存)调用: fread.fwrite.fopen 上面说的带缓存/不带缓存是针对用户态的,内核态本身都是带 ...
- 从协议VersionedProtocol开始4——AdminOperationsProtocol、InterTrackerProtocol、JobSubmissionProtocol、TaskUmbilicalProtocol
1.package org.apache.hadoop.mapred这四个协议都在这个包下. 2.从最简单的AdminOperationsProtocol看, void refreshQueues() ...
- fragment 添加menu
http://bbs.51cto.com/thread-1091458-1-1.html 有详解 @Override public void onCreate(Bundle savedInstance ...
- pyqt5 笔记(二)实现http请求发送
上个图~ index.py 文件 # -*- coding: utf-8 -*- from PyQt5 import QtWidgets,QtCore #从pyqt库导入QtWindget通用窗口类 ...
- 高效的iOS宏定义
iOS开发过程中使用一些常用的宏可以提高开发效率,提高代码的重用性:将这些宏放到一个头文件里然后再放到工程中的-Prefix.pch文件中(或者直接放到-Prefix.pch中)直接可以使用,灰常方便 ...
- ASP.NET中把xml转为dataset与xml字符串转为dataset及dataset转为xml的代码
转自:http://www.cnblogs.com/_zjl/archive/2011/04/08/2009087.html XmlDatasetConvert.csusing System;usin ...