事件

作者: Hey_ebc3 | 来源:发表于2019-08-15 22:43 被阅读0次

事件包括有三类:Touch Motion Remote 本篇主要介绍touch事件

Touch事件

事件产生->事件分发->事件响应

每产生一个时间都会产生一个UIEvent对象,该对象记录了事件、类型、触点等信息

@interface UIEvent:NSObject

属性有 type,subType

方法:-(nullable NSSet<UITouch*>*)allTouches//说明UIEvent持有UITouch,也能用以判断是几个点的触控

@interface UITouch:NSObject

属性 phase,tapCount,gestureRecgnizers

UIView中有方法-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event//用以判断当前的touch是点在了那个View上

hitTest方法从UIWindow开始父类传到子类,subViews按照逆顺序遍历

事件分发从UIAppliction一直到hitTestView

-(void)sendEvent:(UIEvent*)event;

touch响应事件 

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

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

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

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

Responder Chain从子类到父类传递 一直到AppDelegate如果都没有响应就丢弃


实例 加大按钮的点击区域

方法1

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event{

    //使用cgrectInset作用是 改变目标frame的inset

    CGRect targetRect=CGRectInset(_button.frame, -ExtraPadding, -ExtraPadding);

    //重点 查看点击区域在targetRect中吗

    if(CGRectContainsPoint(targetRect,point)){

        //把这一区域设置为button的点击区域

        return _button;

    }

    else

        return [super hitTest:pointwithEvent:event];

}

方法二: 调用hitTest会先调用ponitInside

创建button类 重写

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event{

    CGRecttargetRect=CGRectInset(self.bounds,-20, -20);

    //如果想使用frame 因为frame是父view的坐标系 所以需要转化

    //CGPoint convertPoint=[self convertPoint:point toView:self.superview];

    //CGRect targetRectFrame=CGRectInset(self.frame, -20, -20);

    //此时下方的point应该使用convertPoint

    if(CGRectContainsPoint(targetRect, point)){

        return  YES;

    }

    else

    return  [super pointInside:pointwithEvent:event];

子View超过了父View的范围

方法修改父View的pointInside

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event

{

    //ponit应该是button的坐标系中 而此时point是view的 因此需要转化 

    if([_button pointInside:[self convertPoint:point toView:_button] withEvent:event])

    {

        return YES;

    }

    else

      return  [super pointInside:pointwithEvent:event];

}

相关文章

  • JavaScript事件01——事件流

    大纲:概念(事件、事件流)事件流模型(事件冒泡、事件捕获、DOM事件流) 一、概念: 1、事件:事件就是用户或浏览...

  • 事件对象,事件监听,事件冒泡,事件代理

    一、事件对象 二、冒泡事件:(事件从子元素往父级元素向上触发事件)处理兼容问题:主流浏览器:e.stopPropa...

  • 事件总结

    DOM事件主要内容 事件流 事件注册 事件对象 事件分类 事件代理 什么是DOM事件? 事件是某个行为或者触发,比...

  • Javascript事件系统

    本文内容 事件基础 事件监听方式 事件默认行为 事件冒泡与事件捕获 事件绑定与事件委托 事件基础 注意:本文不会深...

  • Javascript事件-事件冒泡,事件捕获,事件监听和事件委托

    事件处理机制 (一)DOM事件流 DOM模型是一个树形结构,在DOM模型中,HTML元素是有层次的。当一个HTML...

  • 【事件】事件流

    1、JavaScript和HTML之间的交互通过事件实现的。2、事件流描述的是从页面中接收事件的顺序。3、IE 和...

  • 【事件】事件对象

    触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的额信息。(包括导致事件的元...

  • 【事件】事件类型

    DOM3 级事件规定了以下几类事件: UI(User Interface,用户界面)事件,当用户与页面上的元素交互...

  • 2018-09-10JQuery高级应用

    JQuery事件 window事件 鼠标事件 键盘事件 表单事件 事件注册语法$(对象).type(fn)type...

  • JS事件

    ?事件的相关术语 事件类型: 鼠标事件、键盘事件事件名称: click、dbclick等事件目标: 表示与发生事件...

网友评论

      本文标题:事件

      本文链接:https://www.haomeiwen.com/subject/fqntsctx.html