iOS事件拦截处理
来源:互联网 发布:淘宝网防尘口罩 编辑:程序博客网 时间:2024/05/06 14:23
前面分析了一通iOS事件的分发,主要介绍了事件如何找到处理的view,又是如何按照responder chain逐级传递的。这篇文章主要介绍iOS事件的拦截以及特殊处理。
我们知道事件的分发是由Application到Window再到各级View的,所以显然最安全可靠的拦截地方是Application。这里拦截事件后如果不手动往下分发,则进入hit-test View过程的机会都没有。
UIApplication和UIWindow都有sendEvent:方法,用来分发Event。我们可以继承类,重新实现sendEvent:方法,这样就可以拦截下事件,完成一些特殊的处理。
比如:有一个iPad应用,要求在非某个特定view的区域触摸时进行一项处理。
我们当然可以在其余每一个view里面增加代码进行判断,不过这样比较累,容易漏掉一些地方;另外当UI需求变更时,维护的GG往往会栽进这个坑,显然这不是一个好方法。
这里比较简单的解决方案就是在继承UIApplication类,实现自己的sendEvent:,在这个方法里面初步过滤一下事件,是触摸事件就发送Notification,而特定的view会注册这个Notification,收到后判断一下是否触摸到了自己之外的区域。
恩,还是上代码吧,比较清楚一点:
1. 继承UIApplication的DPApplication类
- #import <UIKit/UIKit.h>
- extern NSString *const notiScreenTouch;
- @interface DPApplication : UIApplication
- @end
- #import "DPApplication.h"
- NSString *const notiScreenTouch = @"notiScreenTouch";
- @implementation DPApplication
- - (void)sendEvent:(UIEvent *)event
- {
- if (event.type == UIEventTypeTouches) {
- if ([[event.allTouches anyObject] phase] == UITouchPhaseBegan) {
- [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:notiScreenTouch object:nil userInfo:[NSDictionary dictionaryWithObject:event forKey:@"data"]]];
- }
- }
- [super sendEvent:event];
- }
- @end
- #import <UIKit/UIKit.h>
- #import "AppDelegate.h"
- #import "DPApplication.h"
- int main(int argc, charchar *argv[])
- {
- @autoreleasepool {
- //return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
- return UIApplicationMain(argc, argv, NSStringFromClass([DPApplication class]), NSStringFromClass([AppDelegate class]));
- }
- }
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onScreenTouch:) name:notiScreenTouch object:nil];
- - (void)onScreenTouch:(NSNotification *)notification
- {
- UIEvent *event=[notification.userInfo objectForKey:@"data"];
- NSLog(@"touch screen!!!!!");
- CGPoint pt = [[[[event allTouches] allObjects] objectAtIndex:0] locationInView:self.button];
- NSLog(@"pt.x=%f, pt.y=%f", pt.x, pt.y);
- }
这样就实现了事件的预处理,固有的事件处理机制也没有破坏,这个预处理是静悄悄的进行的。当然,如果我需要把某些事件过滤掉,也只需在DPApplication的sendEvent:方法里面抛弃即可。
转自:http://blog.csdn.net/sakulafly/article/details/18792631
- iOS事件拦截处理
- iOS事件拦截处理
- iOS事件拦截处理
- iOS事件拦截处理
- Android 事件拦截 处理
- ios 事件拦截
- iOS 拦截崩溃处理
- Android事件拦截与处理
- Android 滑动,拦截事件处理
- android事件分发,拦截,处理
- Android事件拦截处理机制
- Android 滑动,拦截事件处理
- ios uiwebview 拦截 点击事件
- iOS拦截控件事件,处理后继续执行原来的消息传递流程
- Android事件分发,事件拦截,事件处理总结
- Android事件分发,事件拦截,事件处理总结
- ViewGroup的事件拦截、事件分发、事件处理
- 【Android】事件传递:向下拦截,向上处理
- LeetCode OJ:Rotate List
- 希望正在迷途中的人懂得天下父母心
- 在cmd下运行不了adb的情况下的解决方案
- 如何在FreeBSD系统下面查询需要的ports位置
- 怎么让程序在windows后台运行
- iOS事件拦截处理
- Edge
- FusionCharts Marimekko图
- ORA-01102: cannot mount database in EXCLUSIVE mode
- ubuntu12.04 64 配置java环境
- Google lmctfy 4.0 - flow of creating a container
- Google Java编程风格指南
- HDU2512-贝尔数
- 【状态机】C语言实现的,兼如何做宏展开