【问题标题】:iOS5 UITapRecognizer for UIScrollView interfering with buttons. How to fix?iOS5 UITapRecognizer 用于 UIScrollView 干扰按钮。怎么修?
【发布时间】:2012-01-05 05:38:01
【问题描述】:

我在 UIView 内有一堆 UIButtons 在 UIScrollView 内。我正在尝试将点击识别器添加到滚动视图。点击识别器触发,但现在我的按钮都不起作用。

我知道在 iOS5 中,UIScrollView 可以在完成后以某种方式将触摸事件向下传递到控件层次结构。任何人都可以帮我弄清楚如何做到这一点?

【问题讨论】:

    标签: ios objective-c uiscrollview uibutton uigesturerecognizer


    【解决方案1】:

    UIGestureRecognizer 属性cancelsTouchesInView 设置为NO。

    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                                                 action:@selector(singleTap:)];
    singleTapGestureRecognizer.numberOfTapsRequired = 1;
    singleTapGestureRecognizer.enabled = YES;
    singleTapGestureRecognizer.cancelsTouchesInView = NO;
    [tapableView addGestureRecognizer:singleTapGestureRecognizer];
    [singleTapGestureRecognizer release];
    

    来自UIGestureRecognizer Class Reference

    影响是否触摸的布尔值 当手势被识别时传递到视图。

    当此属性为 YES(默认值)并且 接收者识别其手势,该手势的触摸是 未交付的未交付到视图和之前交付的触摸 通过 touchesCancelled:withEvent: 消息被取消发送到 风景。如果手势识别器无法识别其手势,或者如果 此属性的值为 NO,视图接收所有触摸 多点触控序列。

    【讨论】:

    • 好的,我没有看到这是想要的行为,但如果它适用于你的情况和@AlexStone 的情况,那就太好了! :-)
    【解决方案2】:

    您还可以使用UIGestureRecognizerDelegategestureRecognizer:shouldReceiveTouch: 方法(记录在here)来完成同样的事情。它提供了更多的灵活性,例如,如果您想取消某些触摸,而不是其他触摸。这是一个例子,

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([touch.view.superview isKindOfClass:[UIButton class]]) return NO;
    
        return YES;
    }
    

    【讨论】:

    • 这其实不是一回事。返回 NO 时,手势识别器不处理触摸。返回 YES 时,UIView 不处理触摸。 cancelsTouchesInView 设置为 NO 意味着手势识别器和视图都接收到触摸。
    • 你是对的。如果您想同时完成这两项工作,您可以在此处返回 NO 之前处理触摸事件。
    【解决方案3】:

    对我来说,上述答案的组合有效

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userDidTap:)];
    tapRecognizer.cancelsTouchesInView = YES;
    tapRecognizer.delegate = self;
    [tapRecognizer requireGestureRecognizersToFail:self.scrollView.gestureRecognizers];
    [self.view addGestureRecognizer:tapRecognizer];
    

    -

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([touch.view.superview isKindOfClass:[UIButton class]] || [touch.view isKindOfClass:[UIButton class]])
        {
            return NO;
        }
        return YES;
    }
    

    【讨论】:

    • 这会使手势识别器在按钮上失败 - 不确定这与问题有何关联。
    • 是的,它会的。就我而言,这是通缉行为。据我所知,这个问题并不清楚。
    猜你喜欢
    • 2020-06-02
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多