UIScrollView中的UIButton不会点亮

时间:2010-06-28 12:02:33

标签: iphone

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; 
 }

7 个答案:

答案 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相互连接

ContentView -> MainView Connect

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

ContentView & MainView Equality

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

// 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

当然,这不是像“只需按两个按钮就可以解决问题”这样的解决方案。在我的案例中,主要原因与限制和内容大小有关。仅供参考,也许会帮助某人。