オーバーライド-[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()
カスタム サブクラスが使用されるように呼び出しを変更します。
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplicationSubclass class]), NSStringFromClass([AppDelegate class]));
}
}
これは、このメカニズムを使用してアクションをターゲットに送信する UIControl サブクラスに対してのみ機能することに注意してください。アプリを通過するすべてのタッチ イベントを表示する場合は、-[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