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
将事件从 UIScrollView 转发到 UIButton