您可以覆蓋-[UIApplication sendAction:to:from:forEvent]
做你想要什麼:
@implementation MyApplicationSubclass
- (BOOL)sendAction:(SEL)action to:(id)target from:(id)sender forEvent:(UIEvent *)event
{
NSLog(@"Sending action %@ from sender %@ to target %@ for event %@", NSStringFromSelector(action), sender, target, event);
return [super sendAction:action to:target from:sender forEvent:event];
}
@end
將在UIApplication的自定義子類。然後,在main.m文件,以便使用您的自定義子類的調用更改爲UIApplicationMain()
:使用此機制這隻適用於UIControl子類,其中發送他們的行動對他們的目標
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class]));
}
}
注意。如果您想查看所有通過應用的觸摸事件,請改爲使用-[UIApplication sendEvent:]
。在這種情況下,將由您決定哪個對象要去接收觸摸。您可以通過在您的主視圖/窗口上調用-hitTest:
來做到這一點,但請記住,它指出觸摸着陸的視圖,而不一定是哪個視圖處理它(視圖可以將事件轉發給其他對象)。例如:
@implementation MyApplicationSubclass
- (void)sendEvent:(UIEvent *)event
{
UIWindow *window = [self keyWindow];
NSSet *touches = [event touchesForWindow:window];
for (UITouch *touch in touches) {
UIView *touchedView = [window hitTest:[touch locationInView:window] withEvent:event];
NSLog(@"Touch %@ received in view %@ for event %@", touch, touchedView, event);
}
[super sendEvent:event];
}
@end
您需要響應水龍頭的方法。他們每個人都可以確定是什麼導致了自來水。 (如果你需要知道事件處理結束後,你可以創建一些'id lastTapTarget'變量並保存它。) –
根據文檔,它說事件對象首先被髮送到UIApplication,然後到窗口,然後到視圖。在到達那裏時是否有辦法攔截這些事件?我不想開始在一個應用程序中爲一堆對象編寫自來水方法,我不擁有 –
您如何看待這個問題?有幾種方法可以回答你的問題。對於UIControl子類,您可以始終定義在進行特定觸摸時調用的操作。如果你只是按照觸摸事件,那麼你可能需要得到沙發的座標,並確定哪個UIView當前佔用的空間。有更多的選擇。真的,這取決於。請爲您的情況提供更多背景。 –