1

我一直在玩这个代码,但不能正确。

当前行为:即使在点击按钮时,我也可以在 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];
}
4

2 回答 2

3

正如stavash建议的那样,您可以执行以下操作:

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

       return NO;
    }

    return YES;
}

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

希望能帮助到你。

于 2012-04-14T13:39:41.783 回答
2

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

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

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

于 2012-04-14T13:32:46.753 回答