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.用单台虚拟主机实现多个域名 ...
随机推荐
- Servlet作业--实现注册和登录
1.注册页面 zhuce.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- 2014北邮新生归来赛解题报告d-e
D: 399. Who Is Joyful 时间限制 3000 ms 内存限制 65536 KB 题目描述 There are several little buddies standing in a ...
- comboBox绑定数据库、模糊查询
实现: 一.绑定数据库 点击查询按钮,comboBox显示从数据库查到的某字段的一列数据 方法:在按钮的点击事件绑定数据库 private void button1_Click(object send ...
- 理解ROS rqt_console和 roslaunch
1.使用rqt_console和roslaunch 这篇教程将介绍使用rqt_console和rqt_logger_level来调试以及使用roslaunch一次启动许多nodes.如果你使用ROS ...
- 文件浏览器及数码相框 -2.3.2-freetype_arm-2
显示多行文字 两行文字左边对齐 简单使用两个循环显示两行字体 根据上一行字体的宽度来进行下一行左边的计算 #include <sys/mman.h> #include <sys/ty ...
- HDOJ 1754 I Hate It 线段树 第二题
I Hate It Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就 ...
- RM报表 文本框 自动换行 相关代码
procedure TRMCustomMemoView.WrapMemo1(aAddChar: Boolean); var lCurHeight, lOneLineHeight, lMaxWidth: ...
- HDU 1693 二进制表示的简单插头dp
题目大意: 找到多条回路覆盖所有非障碍格子,问这样回路的种数 这里的插头与URAL1519 不一样的是 只要管它是否存在即可,只需要1个二进制位表示状态 #include <cstdio> ...
- Android EditText email、数字验证
在做Android注册登录模块的时候,经常需要在客户端就验证用户输入的信息的正确性,如填写邮箱需要验证是否是邮箱,填写手机.年龄等信息需要验证是否是数字.先介绍一下验证邮箱的代码: /** * met ...
- xlistview的java(脚)
package com.bwie.xlistviews; import com.bwie.test.R; import android.content.Context;import android.u ...