1、事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象
 
  ios中三大事件:触Touches摸晃动事件Motion,远程控制事件RemoteControl;其中应有最广泛的是触摸事件
UIView是支持触摸的,由于UIView
内部没有实现跟触摸相关的方法,所以我们再点击UIView创建其子类进行方法实现
2、一般准备做题思路:先在 AppDelegate.m中建立一个 TouchVC对象
TouchViewController *touchVC
= [[TouchViewController alloc]init];

//将touchVC指定self.window的为根视图控制器

self.window.rootViewController =
touchVC;

   
[touchVC release];
然后在 TouchViewController.m中设置颜色
self.view.backgroundColor =
[UIColor yellowColor];
————————————————————————————
以上方法为通常准备方法:
第一类型:点击移动视图
   
 MoveView *moveView = [[MoveView
alloc]initWithFrame:CGRectMake(110, 234, 100,
100)];
 
   moveView.backgroundColor =
[UIColor blackColor];
 
   [self.view
addSubview:moveView];
 
   [moveView
release];
第二类型:捏合视图对象
    PinchView *pinchView
= [[PinchView alloc]initWithFrame:CGRectMake(60, 184, 200, 200)];

pinchView.backgroundColor =
[UIColor orangeColor];

[self.view addSubview:pinchView];

   
[pinchView release];
————————————————————————————
首先总结点击移动视图:

TouchView.m

//如果想让一个视图对象对触摸事件作出反应,需要在这个类中的.m文件中实现跟触摸相关一些方法
//当手指在视图范围内移动的时候触发

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

//       
self.backgroundColor = [UIColor randomColor];

    self.center = CGPointMake(arc4random_uniform(220 - 100 + 1)
+ 100, arc4random_uniform(468 - 100 +1)
+100);

//取出手指对像

UITouch *f
= [touches anyObject];

//当前手指的
位置

    CGPoint location
= [f locationInView:self];

//之前手指位置

CGPoint previousLocation
= [f previousLocationInView:self];

CGPoint center
= self.center;

CGFloat dx
= location.x -
previousLocation.x;

CGFloat dy
= location.y -
previousLocation.y;

self.center = CGPointMake(center.x +
dx, center.y +
dy);

    NSLog(@"%s",__FUNCTION__);

TouchView.m

-
(void)touchesMoved:(NSSet *)touches
withEvent:(UIEvent *)event

{

//1.获取手指对象

UITouch *finger
= [touches anyObject];

    //2.获取手指当前在自身视图的位置
    CGPoint currentLocation
= [finger locationInView:self];
    //3.获取手指之前在视图上的位置
    CGPoint 
previousLocation = [finger previousLocationInView:self];
    //4.计算手指在x轴和y轴上的增量

//手指在x轴上的增量

CGFloat dx
= currentLocation.x -
previousLocation.x;

//手指在y轴上的增量

    CGFloat dy
= currentLocation.y -
previousLocation.y;
    //获取中心点,之前center的位置

CGPoint center
= self.center;

self.center = CGPointMake(center.x +
dx, center.y +
dy);

}

@end



——————————————————————————————————————————
第二种类型捏合视图对象:
首先要把默认的单触点关掉

PinchView.m  继承自UIView

-(instancetype)initWithFrame:(CGRect)frame{

if (self =
[super initWithFrame:frame])
{

        //ios支持多点触摸,只是默认是单点触摸

self.multipleTouchEnabled = YES;

}

    return self;

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

//如果集合中touch集合中手指对象个数为1,就直接返回touchsMoved方法

if (1 ==
touches.count)
{

        return;//结束方法

}else{

//得到集合中所有手指对象,并使用数组存储(数组有序)

    NSArray *allTouchs
= [touches allObjects];
 
     
//取出两个触点
        UITouch *touch1
= [allTouchs firstObject];

UITouch *touch2
= [allTouchs lastObject];

//求出两个手指对象当前的位置

CGPoint 
firstTouch1 = [touch1 locationInView:self];

CGPoint secondTouch2
= [touch2 locationInView: self];

//求出当前两个手指的间距

CGFloat currentDistance
= [self distanceFromeFirstPoint:firstTouch1 secondPoint:secondTouch2];

//求出之前两个手指的位置

CGPoint previousFirstPoint
= [touch1 previousLocationInView:self];

CGPoint previousSecondPoint
= [touch2 previousLocationInView:self];

//求出之前两个点的距离

        CGFloat previousDistance
= [self distanceFromeFirstPoint:previousFirstPoint secondPoint:previousSecondPoint];
        //获取捏合前后两个手指间距的比例

CGFloat rate
= currentDistance / previousDistance;

        //缩放视图,如果视图的大小发生变化时,而中心点的位置不发生变化,修改bounds就可以了

, 0, self.bounds.size.width *
rate, self.bounds.size.height *
rate);

    }

}


//封装一个计算距离的方法(sqrt求开方)

- (CGFloat)distanceFromeFirstPoint
: (CGPoint)firstPoint 
secondPoint : (CGPoint)secondPoint{

CGFloat dx
= firstPoint.x -
secondPoint.x;

CGFloat dy
= firstPoint.y -
secondPoint.y;

//当前两点距离

return  sqrt(dx
* dx + dy * dy);

}



================================================================================
响应者链:

AppDelegate.m

//创建 Responder对象

    ResponderViewController *responderVC
= [[ResponderViewController alloc]init];
    //将responderVC指定为根控制器

self.window.rootViewController =
responderVC;

   
[responderVC release];
ResponderViewController.m
1、  UIResponder
响应者类,继承自NSObject,它是一个响应者的基类,它提供了一些处理事件的方法

//什么是响应者(响应者对象):1.继承自UIResponder
2.能对ios事件中(触摸事件,晃动事件,远程事件)做出响应的对象就叫做响应者

//
UILabel ,UIImageView 
默认用户交互是关闭的
响应者链:确定事件作用的对象时,UIAppcation
--->UIAppcationDelegate--->window--->视图控制器--->视图控制器上的子视图
响应事件:(有大到小)视图控制器上的子视图--->视图控制器--->window--->UIAppcationDelegate---UIAppcation 
如果都不处理这个事件,事件就会被丢弃

ResponderView.m

   ResponderView *redView
= [[ResponderView alloc]initWithFrame:[UIScreenmainScreen].bounds];

redView.tag = 101;

redView.userInteractionEnabled = NO;

redView.backgroundColor =
[UIColor redColor];

[self.view addSubview:redView];

[redView release];

 
    ResponderView *yellowView
= [[ResponderView alloc]initWithFrame:CGRectMake(30, 360, 320, 284)];

yellowView.tag = 102;

//关闭用户的交互造成响应者链就到这个位置断开了,事件只能找他的上一级处理,如果上一级都不处理,此事件就不了了之了

yellowView.userInteractionEnabled = YES;

yellowView.backgroundColor =
[UIColor yellowColor];

[redView addSubview:yellowView];

[yellowView release];

ResponderView *greenView
= [[ResponderView alloc]initWithFrame:CGRectMake(20, 20, 280, 244)];

greenView.tag = 103;

greenView.backgroundColor =
[UIColor greenColor];

[yellowView addSubview:greenView];

[greenView release];

ResponderView *blueView
= [[ResponderView alloc]initWithFrame:CGRectMake(20, 20, 240, 204)];

blueView.tag = 104;

blueView.backgroundColor =
[UIColor blueColor];

[greenView addSubview:blueView];

   
[blueView release];
}
ResponderView.m
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event{
    switch (self.tag)
{

        case 101:

NSLog(@"红色视图");

break;

case 102:

NSLog(@"黄色视图");

break;

case 103:

NSLog(@"绿色视图");

break;

case 104:

NSLog(@"蓝色视图");

break;

default:

break;

   
}
==============================================
欢迎学习本文,未经博主许可,禁止转载!

UIEvent UIResponder UI_04的更多相关文章

  1. iOS学习笔记——触控与手势

    触控 此部分内容已学良久,恨记之甚晚,忙矣,懒矣!本文简而记焉,恐日后忘也. 在iOS的触控事件中,有触控.事件以及响应者这三个角色,一个触摸则代表了一只手指和屏幕接触这个动作所包含的信息:而事件则包 ...

  2. iOS-响应链(Responder Chain)

    2017.05.08 20:40* 字数 1306 阅读 740评论 6喜欢 9 工作接近一年,很久没有更新博客.工作中学到很多知识点后面将花时间整理,作为对一年知识学习的总结: 下面是本篇博客的写作 ...

  3. iOS开发 - 事件传递响应链

    序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UI ...

  4. iOS - UIEvent事件及UIResponder响应者

    在iOS中不是所有的对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,称之为响应者对象: UIApplication.UIViewController.UIView都继承自U ...

  5. UIResponder NSSet UITouch UIEvent

    UIResponder: UIView的超类,用来响应handle(触屏.motion.响应者等)事件. NSSet:一系列的类集合(类似数组). UITouch:一个点击类.负责:点击的view,w ...

  6. iOS 触摸事件与UIResponder(内容根据iOS编程编写)

    触摸事件 因为 UIView 是 UIResponder 的子类,所以覆盖以下四个方法就可以处理四种不同的触摸事件: 1.  一根手指或多根手指触摸屏幕 - (void)touchesBegan:(N ...

  7. iOS 事件处理之UIResponder简介

    在用户使用app过程中,会产生各种各样的事件 iOS中的事件可以分为3大类型:触摸事件.加速计事件.远程控制事件 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处 ...

  8. iOS控件之UIResponder类

    iOS控件之UIResponder类 在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,我们知道UIApplication.UIView.UIViewController这几个 ...

  9. 你真的了解UIEvent、UITouch吗?

    一:首先查看一下关于UIEvent的定义 //事件类型 typedef NS_ENUM(NSInteger, UIEventType) { UIEventTypeTouches, UIEventTyp ...

随机推荐

  1. React Native 项目实战-Tamic

    layout: post title: React Native 项目实战 date: 2016-10-18 15:02:29 +0800 comments: true categories: Rea ...

  2. Android仅2步实现 滚粗 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)

    本文同步自wing的地方酒馆 布吉岛大家有木有看这一篇文章,再见,汉堡菜单,我们有了新的 Android 交互设计方案 本库下载地址:https://github.com/githubwing/Bye ...

  3. 好久没有写BLOG了,人老了就开始变懒了【非技术】

    算算到今天,在码农的路上已经走了15年了.马上就40不惑的我,现在是充满的疑惑.

  4. cassandra 3.x官方文档(2)---架构解析

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  5. Spring Boot 中应用Spring data mongdb

    摘要 本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考. 文末有代码链接 准备 安装mongodb 需要连接mongodb,所 ...

  6. Detailed Item Cost Report (XML) timed out waiting for the Output Post-processor to finish

    In this Document   Symptoms   Cause   Solution   References APPLIES TO: Oracle Cost Management - Ver ...

  7. 23 服务IntentService Demo6

    MainActivity.java package com.qf.day23_service_demo2; import android.app.Activity; import android.co ...

  8. Android中ViewFlipper的使用详解

    说到android的左右滑动效果我们可以说是在每个应用上面都可以看到这样的效果,不管是微博,还是QQ等. 实现左右滑动的方式很多,有ViewPager(不过这个和需要android-support-v ...

  9. 【伯乐在线】最值得阅读学习的 10 个 C 语言开源项目代码

    原文出处: 平凡之路的博客   欢迎分享原创到伯乐头条 伯乐在线注:『阅读优秀代码是提高开发人员修为的一种捷径』http://t.cn/S4RGEz .之前@伯乐头条 曾发过一条微博:『C 语言进阶有 ...

  10. IDEA阅读Spark源码

    将spark编译成idea-sbt工程 tar -zxvf spark-1.1.0.tgz cd spark-1.1.0 sbt/sbt gen-idea 等待-- 成功后就能以SBT工程的形式导入i ...