2

我试图在不破坏其功能的情况下捕获 UIKeyboard 中的所有触摸事件。我试过了:

  • 命中测试:
  • UIGestureRecognizer
  • 在顶部添加一个 UIWindow 并将事件传递给下一个响应者

然而,这些都没有奏效。

而且似乎我们不允许对 UIKeyboard 进行子类化。

你能想到任何可行的方法吗?

谢谢,

顶峰

更新:

让我们简化问题:如何添加将特定触摸事件传递给下一个响应者的 UIView 或 UIWindow(就像将userInteractionEnabled设置为 NO 一样)?

这是我的代码(当然不能工作......):

   - (void)sendEvent:(UIEvent *)event {
    NSLog(@"%@",event);
    //if ([self eventIsNoteworthy:event]) [self extraEventHandling:event];
    [super sendEvent:event];  // Apple says you must always call this!
}

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    CGPoint hitPoint = [underneathButton convertPoint:point fromView:self];
    if ([underneathButton pointInside:hitPoint withEvent:event]) return underneathButton;
    NSLog(@"Called");
    return [super hitTest:point withEvent:event];
    //return mainWindow;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"Start");

    [self.nextResponder touchesBegan:touches withEvent:event];

}
4

2 回答 2

0

我不确定这是否可能。我想到了几件事。一种是重新创造UIKeyboard自己,然后以这种方式捕捉触摸。Apple Docs说明这是可能的。

另一种方法是重新查看您是如何在键盘上方添加 UIWindow 的。据我了解,键盘视图在您的应用程序上以某种方式分层,因此您可能没有 UIWindow 超出键盘(ref)。该链接提供了一个解决方案,用于获取对键盘实际 UIView 的引用,从那里您希望将 UIWindow 放置到键盘视图的父级上。

为了提供帮助,这里有一个脚本,您可以使用它来转储所有视图以查看它们是如何分层的:

static void dumpViews(UIView* view, NSString *text, NSString *indent) 
{
    Class cl = [view class];
    NSString *classDescription = [cl description];
    while ([cl superclass]) 
    {
        cl = [cl superclass];
        classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
    }

    if ([text compare:@""] == NSOrderedSame)
        NSLog(@"%@ %@", classDescription, NSStringFromCGRect(view.frame));
    else
        NSLog(@"%@ %@ %@", text, classDescription, NSStringFromCGRect(view.frame));

    for (NSUInteger i = 0; i < [view.subviews count]; i++)
    {
        UIView *subView = [view.subviews objectAtIndex:i];
        NSString *newIndent = [[NSString alloc] initWithFormat:@"  %@", indent];
        NSString *msg = [[NSString alloc] initWithFormat:@"%@%d:", newIndent, i];
        dumpViews(subView, msg, newIndent);
        [msg release];
        [newIndent release];
    }
}

像这样称呼它:dumpViews([[UIApplication sharedApplication] keyWindow], @"", @"");

希望能有所帮助!:D

于 2012-04-12T23:50:18.880 回答
0

看看这个关于访问(包含)UIKeyboard 的私有视图层次结构的答案。注意,iOS 不支持此功能,Apple 拒绝执行此操作的应用程序。(干扰 UIKit 内部的私有视图层次结构无异于使用私有 API。)

于 2012-04-13T00:32:14.287 回答