zoukankan      html  css  js  c++  java
  • 视图的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(@" masterCV 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中全部视图的编辑结束。


  • 相关阅读:
    c#关闭excel进程失败的解决方法
    [数据库SQL实战] 基本语法记录
    [牛客数据库SQL实战] 51~61题及个人解答
    [牛客数据库SQL实战] 41~50题及个人解答
    [牛客数据库SQL实战] 31~40题及个人解答
    [牛客数据库SQL实战] 21~30题及个人解答
    [牛客数据库SQL实战] 11~20题及个人解答
    [牛客数据库SQL实战] 1~10题及个人解答
    [牛客数据库SQL实战] 准备篇
    我在博客园安家了
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5241137.html
Copyright © 2011-2022 走看看