我有一个UIButton,仅当我点击其中的一个很小的子区域时,它才对我的点击手势做出反应。我是assuming,当我在按钮内的其他位置点击时,也许其他视图正在吞噬我的手势。

问题是..是否有办法知道哪个UIView确切地接收了水龙头?我知道我可以蛮力将所有手势处理程序附加到我的所有视图中,但是似乎工作量太大。有任何想法吗?

更新:
艾哈迈德(Ahmed)在下面的回答非常完美。.我还添加了UIView的recursiveDescription来快速找到问题视图。

即如果我在NSLog行上放置一个断点:

- (void)sendEvent:(UIEvent *)event
{
    [super sendEvent:event];
    UIView *touchReceipientView =((UITouch *)[event.allTouches anyObject]).view;
    NSLog(@"View = %@ ",touchReceipientView);
}

我得到以下输出(作为示例):
(lldb) po [touchReceipientView recursiveDescription]
<UIView: 0x1fd16470; frame = (0 430; 320 40); layer = <CALayer: 0x1fd164d0>>
   | <UIButton: 0x1fd13030; frame = (297 0; 18 19); opaque = NO; tag = 11; layer = <CALayer: 0x1fd130f0>>
   |    | <UIImageView: 0x1fd13190; frame = (-41 -40.5; 100 100); alpha = 0; opaque = NO; userInteractionEnabled = NO; tag = 1886548836; layer = <CALayer: 0x1fd131f0>>
   |    | <UIImageView: 0x1fd14d00; frame = (1 2; 16 15); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1fdc8e50>>

这让我立即确定了有问题的UIView!

最佳答案

您可以将UIApplication子类化,并查看谁在接收事件。

在main.m中,

@interface MyApplication : UIApplication

@end


@implementation MyApplication

- (void)sendEvent:(UIEvent *)event
{
    [super sendEvent:event];
    NSLog(@"View = %@",  ((UITouch *)[event.allTouches anyObject]).view);
}

@end





int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), NSStringFromClass([MyAppDelegate class]));
    }
}

关于iphone - 如何知道正在接收当前手势的 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17695076/

10-14 21:08