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 事件