原文地址:https://www.jianshu.com/p/0b439487b4f9
項目中有個需求是想拿到app裏所有在屏幕上的點擊座標
解決方案創建一個子類繼承自UIApplication
,然後在sendEvent
方法中獲取並判斷
#import "MRApplication.h"
#include <CommonCrypto/CommonCrypto.h>
@interface MRApplication()
@property(nonatomic,assign) BOOL isMoved;
@end
@implementation MRApplication
- (void)sendEvent:(UIEvent *)event{
if (event.type==UIEventTypeTouches) {
UITouch *touch = [event.allTouches anyObject];
if (touch.phase == UITouchPhaseBegan) {
self.isMoved = NO;
}
if (touch.phase == UITouchPhaseMoved) {
self.isMoved = YES;
}
if (touch.phase == UITouchPhaseEnded) {
if (!self.isMoved && event.allTouches.count == 1) {
UITouch *touch = [event.allTouches anyObject];
CGPoint locationPointWindow = [touch preciseLocationInView:touch.window];
NSLog(@"TouchLocationWindow:(%.1f,%.1f)",locationPointWindow.x,locationPointWindow.y);
}
self.isMoved = NO;
}
}
[super sendEvent:event];
}
@end
其實在touch
對象中已經有了View的信息,如果想獲取在view中的相對座標也可以.使用touch.view
即可CGPoint locationPointWindow = [touch preciseLocationInView:touch.view];
注意:這個MRApplication需要在main.m
中引入,然後就可以攔截整個app所有的點擊事件了,其中我對滑動和多點觸控做了處理,不加if
判斷是會拿到滑動和多點觸控時的UIEvent
的
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "MRApplication.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([MRApplication class]), NSStringFromClass([AppDelegate class]));
}
}