ios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用

Posted

技术标签:

【中文标题】ios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用【英文标题】:ios 8 - buttons in horizontal scroll view intercepting pan event - scroll does not work 【发布时间】:2014-09-12 03:36:39 【问题描述】:

我有一个带有一行按钮的水平滚动视图。除非我非常快速地滑动,否则滚动视图不会滚动。

如果我将按钮设置为 userInteractionEnabled = NO,则滚动按预期工作,但当然,按钮根本不起作用。

此应用在 ios 7 及之前的版本中运行良好。这似乎是 iOS 8 的“功能”。我确实注意到我可以捕获按钮的拖动事件,但我不知道如何将其重定向回滚动视图。

我想我需要用 UIViews 替换我的按钮并自己管理事件,但如果有人有其他想法或解决方案,我将不胜感激。

【问题讨论】:

我还没有解决方案,但我只是注意到我有完全相同的问题。当我找到一个解决方案时会发布一个解决方案。 FWIW,我将按钮改写为 UILabel,并使用 UITapGestureRecognizer 进行管理。 Apple 论坛上有一些关于 iOS8 beta 类别下的这个 bug 的 cmet。 糟糕,我确实找到了解决方案,但忘记发帖了。如果您想简化您所做的事情,将发布一个小 UIScrollView 子类。 【参考方案1】:

我发现在 iOS 8 中,UIScrollView 的底层 UIPanGestureRecognizer 不尊重 UIScrollView 的 delaysContentTouches 属性。我认为这是一个 iOS 8 错误。这是我的解决方法:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

【讨论】:

修复工作,但存在一个问题:当用户将手指放在按钮上时,“突出显示”的按钮图像不显示。 非常感谢您的回答。 绝对是我见过的最清晰的解决方案……谢谢!【参考方案2】:

我有一个 UITableView 有这个问题,它有自定义 UITableViewCells 和 UIButtons。我把它放在我的 UITableview 类中。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
    return YES;

解决了我的问题。

编辑:为了清楚起见,您可以创建 UIScrollview 的子类并添加它来解决问题。

【讨论】:

这似乎是正确的解决方案。尝试了 touchShouldBegin: 方法,但始终无法识别按钮点击(如莱昂纳多所述) 这是最好的解决方案。 让我头疼不已,谢谢!这适用于 iOS 5.1 及更高版本。【参考方案3】:

这个技巧对我有用:

UITapGestureRecognizer *nothingTap = [[UITapGestureRecognizer alloc] init];
nothingTap.delaysTouchesBegan = YES;
[_scrollView addGestureRecognizer:nothingTap];

信用:https://devforums.apple.com/thread/241467

【讨论】:

谢谢!像魅力一样工作 - 拯救了我的一天! 如果您不必支持 iOS 5.1,则此方法有效。 Daniel 的解决方案对我来说是全面的。【参考方案4】:

我创建了UIScrollView 的子类来解决这个问题。你只需要这个方法:

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view

    UITouch *touch = [touches anyObject];

    if(touch.phase == UITouchPhaseMoved)
    
        return NO;
    
    else
    
        return [super touchesShouldBegin:touches withEvent:event inContentView:view];
    

然后,如果您正在使用,请记住在情节提要中将类设置为您的子类,并且一切顺利。

【讨论】:

这解决了我的问题。谢谢! 也修复了我的问题——在滚动视图中嵌入了 UISegmentedControl。非常感谢! 我试过了,它修复了 UIScrollView,但有时我的按钮在第一次触摸时没有响应,有没有其他人注意到同样的行为? @Leonardo 是的,注意到同样的事情 - 所以上面的解决方案并没有真正解决问题。令人讨厌的是,可能不得不将所有按钮更改为视图。【参考方案5】:

我有同样的问题,我通过创建UIScrollView 的子类并将它的cancelContentTouches 值设置为TRUE 来解决它,并且它工作正常。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
       return YES;

希望它对你有用。

【讨论】:

以上是关于ios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 tableview 滚动时拦截 UITableView 中的 TouchUpInside 事件

是否可以在按钮上启动滚动视图平移手势

禁用 uicollectionview 水平滚动的外部平移手势

UICollectionView 子视图平移移动而不滚动

如何在一个滚动视图中有多个滚动视图

通过 StoryBoard 在滚动视图中平移大图像