带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动

Posted

技术标签:

【中文标题】带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动【英文标题】:UIScrollView with UIButtons - Scroll View won't scroll when touch began on button 【发布时间】:2014-09-10 17:15:06 【问题描述】:

我刚刚更新到 xCode 6 和 ios 8,我发现我的应用程序有些奇怪。在我的应用程序中,我有一个滚动视图,其中有几个按钮,水平对齐。我将其设置为创建我自己的自定义可滚动标签栏控制器。在更新到 iOS 8 和 xCode 6 之前,一切都很完美,但现在我意识到,当我尝试向左或向右滚动滚动视图时,我最初的触摸是在滚动视图中的一个按钮内,然后没有滚动发生。但是,如果我在按钮之间触摸,则滚动会按预期工作。我认为这是按钮注册触摸的一些问题,就好像滚动视图从未被触摸过。但这在完美之前是 100% 工作的,所以我不知道发生了什么!

【问题讨论】:

仅供在此处使用谷歌搜索的任何人使用。我有一个奇怪的地方,更新到 XCode6,由于某种原因,它在 Storyboard 中的视图上关闭(!)“启用用户交互”。谁知道为什么!我打开它,一切都很好。 【参考方案1】:

我最终创建了 UIScrollView 的子类并将其 cancelContentTouches 值设置为 TRUE,我的问题就解决了

【讨论】:

不适合我。它不像 7.1 那样流畅 我想你的意思是这个方法 -(BOOL)touchesShouldCancelInContentView:(UIView *)view 没有cancelContentTouches。你的意思是canCancelContentTouches?我将它设置为YES,但它仍然不适合我。 正如 rozochkin 所说,覆盖 (BOOL)touchesShouldCancelInContentView:(UIView *)view 并返回 YES 可以解决问题。您必须继承 UIScrollView 才能使这个基本行为起作用,这似乎很奇怪。【参考方案2】:

继承 UIScrollView 并将下面的代码添加到 .m 文件中,确实解决了我在 iOS 8 下的滚动冻结问题。

代码:

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

这个解决方案在pasta12的回答https://***.com/a/25900859/3433059中找到

【讨论】:

在我的情况下需要将此解决方案添加到其他给定的解决方案中。【参考方案3】:

无需继承 ScrollView 就用这个吧:

yourScrollView.panGestureRecognizer.delaysTouchesBegan =yourScrollView.delaysContentTouches;

【讨论】:

以上是关于带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动的主要内容,如果未能解决你的问题,请参考以下文章

带有 UIButtons 的 UIScrollview - 如何重新创建跳板?

在单击或旋转之前未显示带有 UIButtons 的 UIView

带有文本快捷方式的自定义 UIToolbar 的行为与带有 UIButtons 和 UITableViewControllers 的键盘完全不同

带有 UIButtons 的 UIScrollView - 当按钮开始触摸时,滚动视图不会滚动

UITableViewCell 中的 UIButtons 不显示 textLabel 更改,直到单元格滚出屏幕

管理多个按下的 UIButtons