UIScrollView 内的 UIButton 在点击时不会触发

Posted

技术标签:

【中文标题】UIScrollView 内的 UIButton 在点击时不会触发【英文标题】:UIButton inside UIScrollView doesn't fire on tap 【发布时间】:2010-06-28 12:02:33 【问题描述】:

UIScrollView 内的 UIButton 不会在点击时触发。请帮忙解决。

// Add a button
UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
btn1.frame = CGRectMake(0, 0, 26, 18); 
btn1.bounds = CGRectMake(0, 0, 30.0, 30.0); 
[btn1 addTarget:self action:@selector(buttonClick1:) 
                     forControlEvents:UIControlEventTouchUpInside];
[scrollView addSubview:btn1];

- (void)buttonClick1:(id)sender 
    int dd = 4; 

【问题讨论】:

查看scrollView的高度或宽度是否为0,并启用clipSubview 【参考方案1】:

我找到了这个东西:

但是滚动视图会阻塞 除非您设置,否则从按钮触摸 userInteractionEnabled 和 ExclusiveTouch 属性为 NO 上 滚动视图。但这将击败 在里面有一个滚动视图的目的 我认为是一个按钮。

(见Can we put a UIButton in a UIScrollView and vice versa in iPhone)

但是怎么做呢?

假设你有一个 UIScrollView *sv ...然后

sv.userInteractionEnabled = YES;
sv.exclusiveTouch = YES;

我还要补充

sv.canCancelContentTouches = YES;
sv.delaysContentTouches = YES;

【讨论】:

canCancelContentTouches 和 delaysContentTouches 默认为 YES。 ;)【参考方案2】:

您必须设置视图的内容大小。必须大于等于scrollView的内容大小。

因为您的视图的默认尺寸是 320 x 480(3.5" 视网膜)和 320 x 568(4" 视网膜)。所以增加视图的高度为:

self.view.frame=CGRectMake(0, 0, 320, 700);

然后将其添加为您的 scrollView 的子视图将使您获得解决方案。

【讨论】:

【参考方案3】:

老答案:我在 ios 7 中所要做的就是设置好

[_scrollView setDelaysContentTouches:NO];

更新:在做了更多研究之后,如果您的问题是 UIButton 点击似乎只被称为有时,那么这实际上可能是UIScrollView 中的所需行为。 UIScrollView 使用delaysContentTouches 属性自动确定用户是尝试滚动还是尝试按下滚动视图内的按钮。我认为最好不要将此行为更改为默认为NO,因为如果用户的手指放在按钮上,这样做会导致无法滚动。

【讨论】:

【参考方案4】:

我的结构是:

-View
--ScrollView
---ContainerView

我正在使用 snapkit。我的问题是我的 ContainerView 实际上的高度为 0。我可以通过在 ContainerView 上设置 ClipsToBounds = true 来注意到这一点(这样做后没有渲染,因为边界的高度为 0)。

任何超出父视图边界的视图都不会收到内部事件的修饰。

我的解决方法是设置 ContainerView 的左右锚点和底部锚点等于视图,顶部等于 ScrollView(我的 ScrollView 的顶部与我的根视图的偏移)。

【讨论】:

【参考方案5】:

我遇到了同样的问题,我所做的不是将按钮添加到容器视图中,而是将其添加到容器视图顶部的滚动视图中:

scrollView.insertSubview(buttonA, aboveSubview: containerView)

我的结构是:

-View
--ScrollView
---ContainerView

我希望这对任何人都有帮助。

【讨论】:

很想知道为什么实际上需要这样做......有什么解释吗?感谢您的提示,解决了我的问题。 @alasker ,说实话我没有解释,但很高兴知道它对你有帮助。【参考方案6】:

这在 iOS 10 中适用于我

scrollView.delaysContentTouches = false

来自苹果:

一个布尔值,用于确定滚动视图是否延迟对触摸手势的处理。

https://developer.apple.com/documentation/uikit/uiscrollview/1619398-delayscontenttouches

【讨论】:

【参考方案7】:

我尝试了您在此处列出的所有内容。而且在整个互联网上。但我的按钮仍然无法处理。

最后,唯一对我有帮助的东西。而且我能够在滚动视图上保持“isUserInteractionEnabled”为 ON。

那么,我是如何解决的:

1) 转到情节提要

2) 将 ContentView 和 MainView 相互连接

3) 并选择宽度/高度相等

顺便说一句,我还在代码中设置了视图(对我来说,如果没有前面的步骤,它就无法工作)。

// sizes
let width = self.view.safeAreaLayoutGuide.layoutFrame.width
mainView.frame = CGRect(x: 0 , y: 0, width: width, height: self.view.safeAreaLayoutGuide.layoutFrame.height)
contentView.frame = CGRect(x: 0 , y: 0, width: width, height: 1000)
scrollView.frame = CGRect(x: 0 , y: 0, width: width, height: mainView.frame.height)

// constraints:
contentView.widthAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.widthAnchor).isActive = true
scrollView.widthAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.widthAnchor).isActive = true

当然,这不是像“只需按两个按钮,您就会解决问题”的解决方案。就我而言,主要原因与约束和内容大小有关。仅供参考,也许它会对某人有所帮助。

【讨论】:

以上是关于UIScrollView 内的 UIButton 在点击时不会触发的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIScrollView 内的 UIButton 传递延迟滚动手势?

UIScrollView 内的 UIView 上的 UIButton

滚动视图内的UIButton不可单击

将事件从 UIScrollView 转发到 UIButton

如何使 UIButton 与 UIScrollView 一起移动

UIscrollview中的自定义UIButton