屏蔽响应事件继续向父视图传递的category

屏蔽响应事件继续向父视图传递的category

这篇教程是上一篇教程的升级版,将复杂的代码封装成了category,更便于使用:)

效果:

源码:

UIGestureRecognizer+EnvetInCurrentView.h 与 UIGestureRecognizer+EnvetInCurrentView.m

//
//  UIGestureRecognizer+EnvetInCurrentView.h
//  BackgroundView
//
//  Created by YouXianMing on 14-10-3.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

typedef void (^CurrentViewBlock)(UIGestureRecognizer *gesture);
typedef void (^OtherViewBlock)(UIGestureRecognizer *gesture);

@interface UIGestureRecognizer (EnvetInCurrentView)

- (void)eventInCurrentView:(CurrentViewBlock)currentViewBlock
               inOtherView:(OtherViewBlock)otherViewBlock;

@end
//
//  UIGestureRecognizer+EnvetInCurrentView.m
//  BackgroundView
//
//  Created by YouXianMing on 14-10-3.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "UIGestureRecognizer+EnvetInCurrentView.h"

@implementation UIGestureRecognizer (EnvetInCurrentView)

- (void)eventInCurrentView:(CurrentViewBlock)currentViewBlock
               inOtherView:(OtherViewBlock)otherViewBlock
{
    UIEvent *event = [[UIEvent alloc] init];
    CGPoint location = [self locationInView:self.view];

    //check actually view you hit via hitTest
    UIView *view = [self.view hitTest:location withEvent:event];

    if ([view.gestureRecognizers containsObject:self]) {
        currentViewBlock(self);
    } else {
        otherViewBlock(self);
    }
}

@end

使用时候的源码:

//
//  ViewController.m
//  BackgroundView
//
//  Created by YouXianMing on 14-10-3.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "UIView+BackgroundView.h"
#import "UIGestureRecognizer+EnvetInCurrentView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // 添加手势
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(handleSingleTap:)];
    [self.view addGestureRecognizer:tap];

    UILabel *label      = [[UILabel alloc] initWithFrame:self.view.bounds];
    label.text          = @"Y.X. Touch Test";
    label.textAlignment = NSTextAlignmentCenter;
    label.font          = [UIFont fontWithName:@"HelveticaNeue-Thin" size:40.f];
    label.textColor     = [UIColor redColor];
    [self.view addSubview:label];
}

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer
{
    [gestureRecognizer eventInCurrentView:^(UIGestureRecognizer *gesture) {
        NSLog(@"当前视图事件");
        // 显示
        [self.view showBackgroundViewAndConfig:^(BackgroundView *configView) {
            configView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
            configView.startDuration = 0.4f;
            configView.endDuration   = 0.4f;
        }];

        // 延迟3s执行
        [self performSelector:@selector(affterDelay)
                   withObject:nil
                   afterDelay:3.f];
    } inOtherView:^(UIGestureRecognizer *gesture) {
        NSLog(@"其他视图的事件");
    }];
}

- (void)affterDelay
{
    // 隐藏
    [self.view removeBackgroundView];
}

@end

以下是需要注意的地方:

时间: 2024-12-10 22:49:47

屏蔽响应事件继续向父视图传递的category的相关文章

在手势中屏蔽响应事件继续向父视图传递

在手势中屏蔽响应事件继续向父视图传递 没有屏蔽时候的现象: 屏蔽时候的现象: 源码如下(用到了上一篇教程的源码): // // ViewController.m // BackgroundView // // Created by YouXianMing on 14-10-3. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import "ViewController.h" #import "UIVi

winform-C# Winform 在视图设计器模式下,如何响应事件?

问题描述 C# Winform 在视图设计器模式下,如何响应事件? 正在设计一个容器性的用户控件(A),和一个内部控件(B). 意图在于设计类似TreeView和TreeNode关系一样的两个个控件. 现在只能通过属性面板中,直接修改增减A的属性A.Nodes成员(Nodes属性是一个EventList,EventList是继承自List我为他添加了增加.移除的事件). 而且A.Nodes的成员增减后,在**设计模式**下,不能即时体现,只能在调试后才能看见Nodes的成员. 另外,我想通过在视

iOS 从父视图移除方法示例

视图结构 在iOS应用中,视图的结构是树型数据结构,以这种结构来控制视图显示,这种数据结构有一个很好的优点: 层级关系分明,并且方便传递事件.从根节点出发,通过叶节点向下扩展,同一枝的上一个节点就是下一个节点的superview,下一个节点就是上一个节点的subview.每个应用程序有一个主Window,这个Window就是根节点. removeFromSuperview 每一个View都和视图结构和响应者链有直接的关系,但是这篇文章不打算着重的讲这两个方面,主要讲removeFromSuper

由UIImageView中的UIButton不响应事件引发的

今天写了这么一小段测试代码,如下: CGRect imageRect = (CGRect){100, 100, 100, 100}; UIImageView *imageView = [[[UIImageView alloc] initWithFrame:imageRect] autorelease]; imageView.backgroundColor = [UIColor yellowColor]; [self.view addSubview:imageView]; UIButton *ma

js-多个body下的onkeydown键盘响应事件

问题描述 多个body下的onkeydown键盘响应事件 现在需要在jsp页面离开时onbeforeunload方法里面排除掉直接按F5刷新的情况,所以需要监控键盘事件:但实际情况是这个页面比较复杂, 包含有多个body嵌套(不知道去掉里面的body标签会不会有问题),而且有的body下还有iframe,iframe又是另外一个独立的页面..这样再在最外面的那个页面的body标签里定义onkeydown属性,有时键盘响应事件调用不到,要焦点focus在最外面的页面才行,如果在里面的iframe.

activex-ActiveX如何添加对话框上控件的响应事件

问题描述 ActiveX如何添加对话框上控件的响应事件 使用MFC创建一个ActiveX控件AAA,然后添加一个Dialog资源,双击添加Dialog类CNewDlg,在AAACtrl.cpp的OnDraw函数中调用CNewDlg的DoModal()函数,此时activeX控件会展示一个对话框. 如果在对话框中添加一个按钮,在单击时,控件的容器可以接收到此事件通知,请问应该怎么做?也就是说怎么把dialog的操作,通过事件传递给容器,即把dialog的操作与AAACtrl的事件关联起来? 解决方

UIView独占响应事件

exclusiveTouch A Boolean value that indicates whether the receiver handles touch events exclusively. Setting this property to YES causes the receiver to block the delivery of touch events to other views in the same window. The default value of this p

ios-如何给tableViewCell添加选中后的响应事件

问题描述 如何给tableViewCell添加选中后的响应事件 xib 在UIView上拖拽了表格单元tableViewCell上去 还需要怎么做才能实现点击选择该表格单元,该表格单元会变灰色并响应某事件? 解决方案 没搞清楚你要怎么样, Controller 实现代理 设置 tableView.delegate=self; tableView.dataSource=self; 然后实现 - (void)tableView:(UITableView *)tableView didSelectRo

为什么这个鼠标响应事件画不出来点?

问题描述 为什么这个鼠标响应事件画不出来点? public class MyMouseAdapter { public static void main(String[] args){ new MyQFrame("drawing....."); } } class MyQFrame extends Frame{ ArrayList points=null; MyQFrame(String s) { super(s); this.setBackground(new Color(255,2