在视图控制器类中。self.view中会包含多个多层的自己定义视图。

我自己定义了一个uicollectionview类,名称为gridview,又自己定义了一个uicollectionviewcell类,名为gridcell。

在gridcell的contentview中添加uitextfield对象。

+----------------------------+

|A -gridview                |

|+--------+   +------------+ |

||B-      |  |C           | |

||gridcell|   |gridcell   | |

|+--------+  +------------+ |

|                            |

|             
              |

+----------------------------+

这样,该视图控制器类就会展现出一系列的表格组合,类似于excel。要实现的功能有这些:

1、在touch一个格子时就能出现虚拟键盘,从而能够马上编辑它。

2、在虚拟键盘出现以后,再touch表格视图的随意点都能关闭虚拟键盘,但不再次打开可能被touch到的另外一个格子。

3、在longpress一个格子时,还是锁定并移动它到任何位置上。

通过对touch事件的控制,能够实现虚拟键盘的打开和关闭,所见即所得的功能。

uiview的hitTest:withEvent:方法

在自己定义的gridview类中。须要对该方法进行重定义,用于控制touch事件的传播和对gridview的处理。

假设hitTest:withEvent:返回的结果不是nil,则touch事件会传播到gridcell中,并调用gridview的-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event方法。

假设返回的结果是nil,则返回调用视图控制器类中-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event方法。这种方法重载以后。能够实现对控制虚拟键盘的关闭。

因此。重载这种方法,能够实现对touch事件的传播的控制。

gridview中重载的方法

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

{

// 依据条件截断 事件的传输链条

if ([selfisFirstResponder]) {

// [selfresignFirstResponder]; 由于该方法 一次点击会被调用两次,导致其会进一步调用cell中的该方法。所以不在此处 resign first responder

// 在此出将 事件链条 截断,从而使得 集合视图能够工作。否则,将触发集合视图覆盖的虚拟键盘。

//        return NO;

}

return [superpointInside:point withEvent:event];

}

在这种方法中也能够实现对touch事件的传播进行控制。

//---

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

{

GTMLoggerDebug(@"\nmasterCV hitTest:%@", [NSDate date]);

// 依据条件截断 事件的传输链条

if ([selfisFirstResponder]) {

// [selfresignFirstResponder]; 由于该方法 一次点击会被调用两次,导致其会进一步调用cell中的该方法。所以不在此处 resign first responder

// 在此出将 事件链条 截断。从而使得 集合视图能够工作。

否则,将触发集合视图覆盖的虚拟键盘。

return nil;

}

if (self.editingCell)

{

return nil;

}

UIView *result = [superhitTest:point withEvent:event];

return result;

}

注意,这两个方法在一次touch时,会被多次调用。

在ios7.1中,我測试结果是2次调用。在网上看到有说是3次调用的。

因此,该方法中仅仅用来实现touch事件的传播控制。不做其它任务如关闭虚拟键盘等处理。

这些任务处理在视图控制类中实现。

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

{

[supertouchesBegan:touches withEvent:event];

if ([_gridViewisFirstResponder]) {

[_gridViewresignFirstResponder];

}

[self.navigationItem.titleViewendEditing:YES];

[self.viewendEditing:YES];

}

处理的任务分别有:

假设gridview是第一响应者,则重置它。

导航栏上标题视图的编辑结束。

self.view中全部视图的编辑结束。

视图的touch事件的传播控制的更多相关文章

  1. React-Native系列Android——Touch事件原理及状态效果

    Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ...

  2. Android Touch事件传递机制全面解析(从WMS到View树)

    转眼间近一年没更新博客了,工作一忙起来.非常难有时间来写博客了,因为如今也在从事Android开发相关的工作,因此以后的博文也会很多其它地专注于这一块. 这篇文章准备从源代码层面为大家带来Touch事 ...

  3. 移动端的touch事件(一)

    如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢?? 诸如智能手机和平板电脑一类的移动设备通常会有 ...

  4. Android Touch事件传递机制 二:单纯的(伪生命周期)

    转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...

  5. H5案例分享:移动端滑屏 touch事件

    移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...

  6. Android touch 事件传递机制

    前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...

  7. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  8. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

  9. Android Touch事件传递机制解析

    android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...

随机推荐

  1. XML数据的读取—数据库配置文件

    数据库配置文件(config.xml) <?xml version="1.0" encoding="utf-8"?> <configurati ...

  2. apache的500错误是写到哪个文件里面

    apache的500错误是写到哪个文件里面

  3. android studio adb 打不开

    1.cmd-->C:\Users\Administrator>adb start-serveradb server is out of date. killing...error: cou ...

  4. linux jdk,java ee ,tomcat 安装配置

    1.把mypagekage.iso 挂载到linux操作系统中. 在VM做好配置,使用 mount /mnt/cdrom 2.把安装文件拷贝到/home cp 文件名 /home (快捷键tab) 3 ...

  5. JavaScript--基本包装类型+Math对象

    1. 基本包装类型 1)为了便于操作基本类型值,ECMAScript提供了3个特殊的引用类Boolean, Number, String       每当读取一个基本类型值的时候,后台就会创建一个对应 ...

  6. 总结:如何获取同一个DIV里的多个不同子标签的值,并赋值给input?

    这个问题说起来简单,但对于新手来说,也着实卡了好久,并且我在网上搜了好久没能找到合适的答案, 于是去博问问了一下,得到许多大神们的帮助与回答,接下来我就总结一下能够实现这个效果的几种方法,既为了自己更 ...

  7. [转]《深度探索C++对象模型》读书笔记[二]

    3.3 Data Member的存取1.   不管什么情况,每一个static data member只有一个实体,放在程序的data segment之中,每次程序取用static member,不管 ...

  8. 《Linux内核分析》week1作业-分析一个简单c语言的汇编代码

    1.C语言源码 #include <stdio.h> int g(int x){ ; } int f(int x){ return g(x); } int main(){ )+; } 2. ...

  9. php判断是移动端还是pc

    //判断是否是手机 function is_mobile() { $agent = strtolower($_SERVER['HTTP_USER_AGENT']); $is_pc = (strpos( ...

  10. 【结构型】Facade模式

    外观模式主要意图是为子系统提供一个统一的接口,从而使用用户对子系统的直接依赖中,解耦合出来.Facade主要是通过为子系统统一封装个入口一样,原先用户对子系统的接口.类等都是直接访问,现在要通过Fac ...