2012-04-14 60 views
1

我一直在玩这个代码,但不能正确的。UIScrollView与UIButton和UITapGestureRecognizer

当前行为:即使在点击按钮时,我也可以在UIScrollView上自由滚动。当我点击某个不是按钮的东西时,它会调用一个方法(就像我想要的那样),作为UITapGestureRecognizer的结果。但是,我必须按住按钮几秒钟,然后触摸它来触发按钮的UIControlEventTouchUpInside。

我想要发生的事情:完全一样,但能够轻松触及UIButton,就像我可以关闭位于视图上的UITapGestureRecognizer一样。

这里是我的代码:

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

回答

2

由于stavash建议,你可以做到以下几点:

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

     return NO; 
    } 

    return YES; 
} 

这在大多数情况下。另外,您可能需要使用isDescendantOfView:来检查触摸的视图是否是滚动视图的后代。

希望它有帮助。

+0

这与我上面的代码结合,现在意味着任何触及UIButton的结果都会直接按下它。我想这很像iPhone跳板,在uiscrollview上有uibutton,但在滚动时触摸它们并没有直接的效果。 – Andrew 2012-04-14 14:12:40

2

我认为你的回答是UIGestureRecognizerDelegate的方法:

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

检查触摸的视图属性是任何你想避免UIButtons的:如果是这样的回报否,否则返回YES。不要忘记分配UITapGestureRecognizer的委托,以便它可以工作。希望这可以帮助。