带有 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 - 当按钮开始触摸时,滚动视图不会滚动