我的观点结构:
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会停止垂直滚动。
感谢您的帮助!
答案 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
的子视图)。
2)选择button
以及您希望按钮所在的contentV
中的元素(在我的情况下:在conventV中的最后一个元素之后)
3)添加必要的约束(在我的情况下:底部对齐)
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