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;
}
答案 0 :(得分:15)
我找到了这个东西:
但是scrollview会阻止 除非你设置,否则从按钮触摸 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;
答案 1 :(得分:12)
您必须设置视图的内容大小。它必须大于或等于scrollView的内容大小。
因为视图的默认大小为320 x 480(3.5“视网膜)和320 x 568(4”视网膜)。所以增加视图的高度为:
self.view.frame=CGRectMake(0, 0, 320, 700);
然后将其添加为scrollView的子视图将使您获得解决方案。
答案 2 :(得分:6)
OLD ANSWER:我在iOS 7中所做的一切都已设置
[_scrollView setDelaysContentTouches:NO];
更新经过多一点研究后,如果您的问题是UIButton
点击似乎只被称为有时,那么实际上可能是UIScrollView
内所需的行为。 UIScrollView
使用delaysContentTouches属性自动确定用户是否正在尝试滚动或尝试按滚动视图内的按钮。我认为最好不要将此行为更改为默认为NO
,因为这样做会导致无法滚动,如果用户的手指在按钮上。
答案 3 :(得分:4)
我遇到了同样的问题,我所做的不是将按钮添加到容器视图,而是将其添加到容器视图顶部的滚动视图中:
scrollView.insertSubview(buttonA, aboveSubview: containerView)
我的结构是:
-View
--ScrollView
---ContainerView
我希望这对任何人都有帮助。
答案 4 :(得分:3)
我有与Giovanny的答案相同的结构,并且正在使用snapkit。我的问题是我的ContainerView实际上有一个高度为0.我能够通过在ContainerView上设置ClipsToBounds = true来注意到这一点(执行此操作后没有渲染,因为边界的高度为0)。
父视图范围之外的任何视图都不会在事件内部进行修饰。
我的修复是将ContainerView左右和底部锚点设置为等于View,顶部等于ScrollView(我的ScrollView' s顶部偏离我的根视图')。
答案 5 :(得分:1)
这适用于iOS 10
scrollView.delaysContentTouches = false
来自Apple:
一个布尔值,用于确定滚动视图是否延迟处理触摸手势。
https://developer.apple.com/documentation/uikit/uiscrollview/1619398-delayscontenttouches
答案 6 :(得分:0)
我尝试了您在此处列出的所有内容。甚至在整个互联网上。但是我的按钮仍然无法操作。
最后,唯一的帮助了我。而且我能够在“滚动视图”上保持“ isUserInteractionEnabled”为打开状态。
所以,我如何解决它:
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
当然,这不是像“只需按两个按钮就可以解决问题”这样的解决方案。在我的案例中,主要原因与限制和内容大小有关。仅供参考,也许会帮助某人。