2012-04-10 4 views
2

Ich versuche, alle Berührungsereignisse in einem UIKeyboard zu erfassen, ohne die Funktionalität zu beeinträchtigen. Ich habe versucht:Übergeben Sie bestimmte Berührungsereignisse in UIView/UIWindow an den nächsten Responder (sendEvent:/hitTest: Funktioniert nicht)

  • HitTest:
  • UIGestureRecognizer
  • eine UIWindow in der oberen Hinzufügen und passieren Ereignisse zum nächsten Responder

jedoch keiner von ihnen arbeitete.

Und es scheint, dass wir das UIKeyboard nicht unterteilen dürfen.

Können Sie an irgendeine Methode denken, die möglicherweise funktioniert?

Danke,

Spitzen

Update:

Lässt das Problem vereinfachen: Wie kann ich eine UIView oder UIWindow hinzufügen, die spezifische Ereignisse Kontakt zu den nächsten Responder geht (wie bei der Einstellung userInteractionEnabled zu NO)?

Heres mein Code (natürlich nicht funktionieren kann ...):

- (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]; 

} 
+0

Wenn Sie Touch-Ereignisse sagen, meinen Sie die Sequenz bestimmte Tasten wurden gedrückt? – blake305

+0

@ blake305 Nein, ich meine die CGPunkte der berührten Positionen. – PeakJi

+0

Möchten Sie nun Ihre eigene Tastatur erstellen, sie präsentieren und die Buchstaben an das textField übergeben lassen, und NSLoggen Sie die CGPoints? – AMayes

Antwort

0

Ich bin nicht sicher, ob es möglich ist oder nicht. Ein paar Dinge kommen mir in den Sinn. Eine ist, die UIKeyboard selbst neu zu erstellen und dann die Berührungen auf diese Weise zu erfassen. Apple Docs Angabe, dass es möglich ist.

Das andere wäre wieder zu sehen, wie Sie die UIWindow Oberkante der Tastatur hinzugefügt haben. Es ist mein Verständnis, dass die Tastaturansicht irgendwie anders über Ihre App geschichtet ist, so dass Sie nicht den UIWindow-Overtop der Tastatur (ref) gehabt haben könnten. Dieser Link bietet eine Lösung, um einen Verweis auf die tatsächliche UIView für die Tastatur zu erhalten. Von dort aus möchten Sie Ihr UIWindow auf dem übergeordneten Element der Tastaturansicht platzieren.

Um, ist hier ein Skript zu helfen, die Sie alle Ansichten verwenden können, um auskippen zu sehen, wie sie geschichtet sind sein:

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]; 
    } 
} 

Nennen Sie es dies wie: dumpViews([[UIApplication sharedApplication] keyWindow], @"", @"");

Hoffnung, dass einige hilft ! : D

+2

Hier ist ein One-Liner, den Sie im Debugger verwenden können, um das gleiche zu erreichen: 'po [[[UIApplication sharedApplication] keyWindow] rekursiveDescription]' – cbowns

+0

@cbowns das ist genial! Vielen Dank. –

+0

Danke für deine Antwort ;-) Ich bin mir sicher, dass sich mein UIWindow oben auf der Tastatur befindet. Ich habe die Frage aktualisiert. – PeakJi

0

Werfen Sie einen Blick auf this answer über den Zugriff auf die private Ansicht Hierarchie, die das UIKeyboard enthält. N.b. Dies wird in iOS nicht unterstützt und Apple lehnt Apps ab, die dies tun. (Interferieren mit privaten Ansichtshierarchien innerhalb von UIKit ist gleichbedeutend mit der Verwendung privater API.)

+0

Danke! Aber diese Methode funktioniert nicht auf iOS5 ;-( – PeakJi

Verwandte Themen