博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
视图的touch事件的传播控制
阅读量:5043 次
发布时间:2019-06-12

本文共 2226 字,大约阅读时间需要 7 分钟。

在视图控制器类中。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中全部视图的编辑结束。

转载于:https://www.cnblogs.com/mengfanrong/p/5241137.html

你可能感兴趣的文章
Spring注解之@Lazy注解,源码分析和总结
查看>>
多变量微积分笔记24——空间线积分
查看>>
Magento CE使用Redis的配置过程
查看>>
poi操作oracle数据库导出excel文件
查看>>
(转)Intent的基本使用方法总结
查看>>
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>