iOS 獲取整個app在屏幕上的點擊座標

原文地址: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]));
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章