21

My structure of views:

UITableView
  UITableViewCell
    UIScrollView
      CustomView
        UIButton

The problem is UIButton doesn't work when I touch it. I create it with code:

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

I've also add this:

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

But my button doesn't work anyway. I can't cancelContentTouches or set delay for UITableView because if I set it, UITableView stop scrolling verticaly.

Thanks for any help!

4

8 回答 8

22

创建 UIScrollview 的子类

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
  return NO;
}

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

scrollView.delaysContentTouches = NO;

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

于 2013-05-20T13:26:45.230 回答
4

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

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

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

在包含 Scroll View 的类中:

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

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

于 2013-05-21T10:11:37.977 回答
3

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

对于内部 UIScrollView 实现这个委托方法。

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

这可能有效。

于 2013-05-20T13:06:22.870 回答
3

没有一个答案对我有用,因为我的问题是按钮在布局时不可见或其他什么......

使固定:

1)将按钮scrollView完全移出(成为VC main 的子视图view)。

主视图的层次结构

2)button从您想要放置按钮的元素中选择和元素contentV(在我的情况下:在conventV中的最后一个元素之后)

按钮和最后一个元素选择

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

在此处输入图像描述

4) 为button.

5)享受。

于 2018-04-25T17:29:06.980 回答
2

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

于 2013-05-20T13:09:38.370 回答
1

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

于 2017-08-24T16:24:56.117 回答
0

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

允许 UIScrollView 及其子视图都响应触摸 如果您有类似的问题,请使用它。

于 2013-05-21T09:06:45.823 回答
-1

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

将同一 UITableViewCell 中的 UIButton 的 delaysContentTouches 设置为 NO。

self.tableView.delaysContentTouches = NO
于 2016-08-23T06:04:48.473 回答