UIButton在UIScrollView中不起作用

时间:2013-05-20 12:33:34

标签: ios uiscrollview uibutton

我的观点结构:

UITableView
  UITableViewCell
    UIScrollView
      CustomView
        UIButton

问题是当我触摸它时UIButton不起作用。 我用代码创建它:

btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
btn.layer.zPosition = 1;
[self addSubview:btn];

我还添加了这个:

scroll.delaysContentTouches = NO;
scroll.canCancelContentTouches = NO;

但我的按钮无论如何都不起作用。我无法取消内容或为UITableView设置延迟,因为如果我设置它,UITableView会停止垂直滚动。

感谢您的帮助!

8 个答案:

答案 0 :(得分:19)

使用

创建UIScrollview的子类
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
  return NO;
}

如果您没有收到该消息,请设置:

scrollView.delaysContentTouches = NO;

问题是因为默认情况下touchesShouldCancelInContentView的行为方式,只有当子视图是UIControl时才返回NO,但是你的按钮隐藏在CustomView中,而不是。

答案 1 :(得分:4)

遇到了同样的情况。 UIScrollView在单独的类中,并通过自定义视图添加按钮。 'NSNotificationCenter'帮助我解决了这个问题。 示例代码:

-(void)tileTouchUpInside:(id)sender
{    
    NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"];

    [[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict];
}

在包含滚动视图的类中:

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil];
}
-(void)doAction:(NSNotification *) notification
{
    NSString* value =[notification.userInfo valueForKey:@"index"];
    // .......
}

为滚动视图,自定义视图和按钮启用userInteraction。

答案 2 :(得分:3)

我猜你需要设置按钮框。默认情况下,如果您使用btn = [[UIButton alloc] init];方法初始化按钮,它将为UIButtonTypeCustom。同时为其设置背景颜色以进行调试,以记下实际放置按钮的位置。  现在为您的情况,您需要设置该按钮的框架,如btn.frame = CGRectMake(0,0,100,100);

对于内部UIScrollView,实现此委托方法。

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
  {
       return ![view isKindOfClass:[UIButton class]];
  }

这可能有效。

答案 3 :(得分:2)

您的CustomView框架可能会干扰您的UIButton。它们重叠吗?将您的按钮添加到CustomView只是为了[CustomView addSubview:UIButton];进行测试(当然使用您的值)。如果它有效,那么您的问题很可能是重叠。

答案 4 :(得分:2)

没有一个答案对我有用,因为我的问题是按钮在布局时没有看到......

FIX:

1)将按钮完全移出scrollView(成为VC&#39的主要view的子视图)。

main view's hierarchy

2)选择button以及您希望按钮所在的contentV中的元素(在我的情况下:在conventV中的最后一个元素之后)

button and last element selection

3)添加必要的约束(在我的情况下:底部对齐)

enter image description here

4)为button添加其余约束。

5)享受。

答案 5 :(得分:0)

Capt.Hook的链接帮助了我。我使用了UIGestureRecognizer而不是UIButtons。

Allow UIScrollView and its subviews to both respond to a touch 如果你有类似的问题,请使用它。

答案 6 :(得分:0)

将CustomView中的所有子视图添加到ScrollView。并隐藏CustomView。确保CustomView(scrollView的ContainerView)也应该是scrollView的子视图。

答案 7 :(得分:-1)

我有同样的问题&相同的视图层次结构,使用最新的sdk,只需使用它:

在同一个UITableViewCell中将UIDutton的delaysContentTouches设置为NO。

self.tableView.delaysContentTouches = NO