UIEvent UIResponder UI_04

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就可以了

        self.bounds = CGRectMake(0, 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;

   
}

==============================================

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

时间: 2024-08-02 07:13:23

UIEvent UIResponder UI_04的相关文章

UIEvent UIResponder UI_04

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

UIKit 框架之UIResponder

前面博客有讲触摸事件提过响应事件和响应者链,而管理响应者链的正是UIResponder. 一.代码 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSLog(@"window:%@",[self.window nextResponder]); NSLog(@"AppDelegate: %@",

Cocoa编程之IBAction和IBOutlet含义

IBAction / IBOutlet / IBOutletCollection 时间 2014-05-05 15:00:00  NSHipster原文  http://nshipster.com/ibaction-iboutlet-iboutletcollection/ In programming, what often begins as a necessary instruction eventually becomes a vestigial cue for humans. In th

开源中国iOS客户端学习 (一) Prefix.pch文件

当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以  -Prefix.pch结尾文 件的文件,pch全称是"precompiled header",也就是预编译头文件,该文件里存放的工程中一些不 常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度.我们知道当我们修改一 个工程中某个文件代码时候,编译器并不是重新编译所有所有文件,而是编译改动过文件的,假如pch 中某个文件修改了,那么pch整个文件里包含的的其他文件也会重新编译一次,这样就会

iOS Programming 触摸事件处理详解

iphone/ipad无键盘的设计是为屏幕争取更多的显示空间,大屏幕在观看图片.文字.视频等方面为用户带来了更好的用户体验.而触摸屏幕是iOS设备接受用户输入的主要方式,包括单击.双击.拨动以及多点触摸等,这些操作都会产生触摸事件. 在Cocoa中,代表触摸对象的类是UITouch.当用户触摸屏幕后,就会产生相应的事件,所有相关的UITouch对象都被包装在事件中,被程序交由特定的对象来处理.UITouch对象直接包括触摸的详细信息. UITouch类中包含5个属性: window:触摸产生时所

《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

原创文章,欢迎转载.转载请注明:关东升的博客  应用与用户进行交互,依赖于各种各样的事件.事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成的.响应者链在事件处理中是非常重要的,响应者链可以把用户事件路由给正确的对象.   响应者对象与响应链 UIResponder是所有响应者对象的基类,它不仅为事件处理,而且也为常见的响应者行为定义编程接口.UIApplication.UIView(及其子类,包括UIWindow)和UIViewController(及其

iOS开发之触摸事件及手势

1.iOS中的事件 在用户使用app过程中,会产生各种各样的事件,iOS中的事件可以分为3大类型: 2.响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象", UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. 2.UIResponder 继承了UIResponder就可以处理事件.UIResponder内部

iOS面试必看,最全梳理

原文 序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程

ScrollView分析

alwaysBounceHorizontal          //一个布尔值,决定是否弹跳总是出现水平滚动时达到结束内容的看法.默认值是NO . @property(nonatomic) BOOL alwaysBounceHorizontal       //如果这个属性被设置为YES而且bounces的值是YES,水平拖动是允许的内容,即使小于滚动视图的边界.默认值是NO  alwaysBounceVertical            //一个布尔值,决定是否反弹总是发生在垂直滚动到达结束