视图的touch事件的传播控制
在视图控制器类中。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事件的传播控制的更多相关文章
- React-Native系列Android——Touch事件原理及状态效果
Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ...
- Android Touch事件传递机制全面解析(从WMS到View树)
转眼间近一年没更新博客了,工作一忙起来.非常难有时间来写博客了,因为如今也在从事Android开发相关的工作,因此以后的博文也会很多其它地专注于这一块. 这篇文章准备从源代码层面为大家带来Touch事 ...
- 移动端的touch事件(一)
如果我们允许用户在页面上用类似桌面浏览器鼠标手势的方式来控制WEB APP,这个页面上肯定是有很多可点击区域的,如果用户触摸到了那些可点击区域怎么办呢?? 诸如智能手机和平板电脑一类的移动设备通常会有 ...
- Android Touch事件传递机制 二:单纯的(伪生命周期)
转载于:http://blog.csdn.net/yuanzeyao/article/details/38025165 在前一篇文章中,我主要讲解了Android源码中的Touch事件的传递过程,现在 ...
- H5案例分享:移动端滑屏 touch事件
移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch ...
- Android touch 事件传递机制
前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事 ...
- Android中的Touch事件
Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...
- Android Touch事件传递机制解析 (推荐)
最近新闻列表里的下拉 down up move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...
- Android Touch事件传递机制解析
android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEven ...
随机推荐
- z-index优先级总结
因为显示器显示的图案是一个二维平面,拥有x轴和y轴来表示位置属性.为了表示三维立体的概念如显示元素的上下层的叠加顺序引入了z-index属性来表示z轴的区别,表示一个元素在叠加顺序上的上下立体关系. ...
- ESXi控制台TSM:弥补vSphere Client不足
当vSphere Client不能完成某些任务时,主机的ESXi控制台及其技术支持模式(TSM)可能能派上用场. ESXi控制台允许管理员执行不能通过vSphere Client进行配置的管理任务,比 ...
- PL/SQL中的变量案例解析
1.标量: ag1: declare v_ename emp.ename%type;--自己称为单变量 begin select ename into v_ename from emp where e ...
- 用CAGradientLayer实现渐变色动画
效果图: github:https://github.com/RinpeChen/CAGradientLayerBasicDemo
- 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码
直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...
- Ubuntu 12.04更换显示器后显示“显示不支援”,只能进恢复模式工作
以前用的一台14寸液晶,换成17寸后,进入系统显示器上“显示不支援” .仔细观查,电脑硬盘自检能显示后,后面都是黑屏. 解决过程. 因为grub 启动菜单不能显示.盲按方向键,发现菜单里的其它项目可 ...
- 转载自php100中文网 centos下lamp 环境搭建
学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我介绍一下LAMP环境的搭建,即Linux.Apache.MySQL.PHP环境. 一. ...
- 用C++类模板实现栈结构出现的问题以及思考
C++中使用了模板来减少方法相同但是类型不一样带来的函数重载以及大量复制代码的问题.这里主要说说类模板 类模板的定义: template<TYPENAME Type> clas ...
- 自己动手开发编译器(四)利用DFA转换表建立扫描器
上回我们介绍了两种有穷自动机模型——确定性有穷自动机DFA和非确定性有穷自动机,以及从正则表达式经过NFA最终转化为DFA的算法.有些同学表示还是难以理解NFA到底怎么转化为DFA.所以本篇开头时我想 ...
- Solr Dataimport配置
参考资料: https://cwiki.apache.org/confluence/display/solr/Uploading+Structured+Data+Store+Data+with+the ...