作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试调试游戏中一些与 TouchBegan/Moved/Ended 相关的减速问题;我认为我的一些触摸响应器没有正确卸载,因此随着游戏在越来越多的触摸响应器上运行,触摸响应器会变得越来越不响应,因为它们必须通过越来越大的响应器链。
是否有某种方法可以查看/检索 UITouch 在链中移动时所采取的路径?或者只是某种方式来检索所有事件响应者的列表?
谢谢,-S
最佳答案
您可以劫持 UIResponder
上所需的方法来添加日志记录,然后调用原始方法。这是一个例子:
#import <objc/runtime.h>
@interface UIResponder (MYHijack)
+ (void)hijack;
@end
@implementation UIResponder (MYHijack)
+ (void)hijackSelector:(SEL)originalSelector withSelector:(SEL)newSelector
{
Class class = [UIResponder class];
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method categoryMethod = class_getInstanceMethod(class, newSelector);
method_exchangeImplementations(originalMethod, categoryMethod);
}
+ (void)hijack
{
[self hijackSelector:@selector(touchesBegan:withEvent:) withSelector:@selector(MYHijack_touchesBegan:withEvent:)];
}
- (void)MYHijack_touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"touches!");
[self MYHijack_touchesBegan:touches withEvent:event]; // Calls the original version of this method
}
@end
然后在您的应用程序中的某个位置(我有时将其放在 main()
本身中),只需调用 [UIResponder hijack]
即可。只要 UIResponder
子类在某个时刻调用 super
,您的代码就会被注入(inject)。
method_exchangeImplementations()
是一件美丽的事情。当然要小心;它非常适合调试,但如果不加区别地使用会非常困惑。
关于iphone - 有没有办法检索每个处理过 UITouch 的响应者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929740/
我是一名优秀的程序员,十分优秀!