2012-04-14 5 views
1

Ich habe mit diesem Code herum gespielt, kann es aber nicht richtig machen.UIScrollView mit einem UIButton und UITapGestureRecognizer

Aktuelles Verhalten: Ich kann auf einem UIScrollView frei herumlaufen, auch wenn ich auf Tasten tippe. Wenn ich auf etwas stoße, das keine Schaltfläche ist, ruft es eine Methode (wie ich es möchte) als Ergebnis eines UITapGestureRecognizer auf. Allerdings muss ich für einige Sekunden auf eine Taste drücken und dann nach oben tippen, um die UIControlEventTouchUpInside der Taste auszulösen.

Was ich möchte: Genau das gleiche, aber in der Lage zu sein, den UIButton leicht zu berühren, wie ich kann, wenn ich den UITapGestureRecognizer auf der Ansicht abstelle, auf der er sitzt.

Hier ist mein Code:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     //... 

     [cell.xButton addTarget:self action:@selector(xButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

     self.delaysContentTouches = YES; 

     UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)]; 
     [self addGestureRecognizer:tapGestureRecognizer]; 
     tapGestureRecognizer.delegate = self; 
    } 
} 

- (void) handleTapFrom: (UITapGestureRecognizer *)recognizer 
{ 
    [self.header removeKeyboard]; 
} 

Antwort

2

Als stavash vorgeschlagen, könnten Sie Folgendes tun:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    UIView* touchedView = [touch view]; 
    if([touchedView isKindOfClass:[UIButton class]]) { 

     return NO; 
    } 

    return YES; 
} 

Dies funktioniert in den meisten Fällen. Darüber hinaus möchten Sie möglicherweise überprüfen, ob die berührte Ansicht von der Scroll-Ansicht abstammt, indem Sie isDescendantOfView: verwenden.

Ich hoffe, es hilft.

+0

Dies, kombiniert mit meinem Code oben, bedeutet jetzt, dass alle Berührungen auf dem UIButton zu einem direkten Drücken zu ihm führt. Ich möchte, dass dies ähnlich funktioniert wie das iPhone-Sprungbrett, auf dem du Uibuttons in der Uiscrollansicht hast, aber wenn du sie beim Scrollen berührst, hat das keinen direkten Effekt. – Andrew

2

Ich denke, Ihre Antwort UIGestureRecognizerDelegate Methode ist:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 

Überprüfen Sie, ob die Eigenschaft Ansicht Berührung eine der UIButtons ist, dass Sie versuchen zu vermeiden: wenn ja Rückkehr NEIN, andernfalls JA. Vergessen Sie nicht, den Delegaten des UITapGestureRecognizers so zuzuweisen, dass er funktioniert. Hoffe das hilft.