Iphone 带有UIButton和UIApgestureRecognitor的UIScrollView

Iphone 带有UIButton和UIApgestureRecognitor的UIScrollView,iphone,objective-c,ios,uibutton,uitapgesturerecognizer,Iphone,Objective C,Ios,Uibutton,Uitapgesturerecognizer,我一直在玩弄这段代码,但无法正确使用 当前行为:我可以在UIScrollView上自由滚动,即使在点击按钮时也是如此。当我点击一些不是按钮的东西时,它会调用一个方法(就像我希望的那样),这是UITapGestureRecognitor的结果。但是,我必须按住按钮几秒钟,然后触摸它以触发按钮的UIControlEventTouchUpInside 我希望发生的事情:完全一样,但是能够轻松地触摸UIButton,就像我在它所在的视图上关闭UIApgestureRecognitor一样 这是我的密码:

我一直在玩弄这段代码,但无法正确使用

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

我希望发生的事情:完全一样,但是能够轻松地触摸UIButton,就像我在它所在的视图上关闭UIApgestureRecognitor一样

这是我的密码:

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

我认为您的答案是UIgestureRecognitzerDelegate的方法:

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

检查触摸屏的view属性是否为您试图避免的UIButton:如果是,则返回NO,否则返回YES。不要忘记分配UITapGestureRecognitor的委托,使其工作。希望这能有所帮助。

我认为您的答案是UIgestureRecognitizerDelegate的方法:

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

检查触摸屏的view属性是否为您试图避免的UIButton:如果是,则返回NO,否则返回YES。不要忘记分配UITapGestureRecognitor的委托,使其工作。希望这能有所帮助。

根据斯塔瓦什的建议,您可以执行以下操作:

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

       return NO;
    }

    return YES;
}
这在大多数情况下都有效。此外,您可能需要使用
isDiscendaToView:
检查触摸视图是否是滚动视图的后代


希望能有所帮助。

根据斯塔瓦什的建议,您可以执行以下操作:

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

       return NO;
    }

    return YES;
}
这在大多数情况下都有效。此外,您可能需要使用
isDiscendaToView:
检查触摸视图是否是滚动视图的后代


希望有帮助。

这一点,再加上我上面的代码,现在意味着任何触摸UIButton都会直接按下它。我希望它能像iPhone springboard一样工作,在uiscrollview上有UIButton,但在滚动时触摸它们并没有直接的效果。这与我上面的代码相结合,现在意味着任何触摸UIButton都会直接按下它。我希望它能像iPhone springboard一样工作,在uiscrollview上有uibuttons,但在滚动时触摸它们并没有直接的效果。