我有一个UITableview
,其子类为UIVIew
,位于表格的一部分之上,如下所示:
-uitable--
|--uiview-|
|| ||
|| ||
|---------|
| |
| |
-----------
视图与tableview具有相同的superview,但部分覆盖了tableview。 UIView
上有几个按钮。我希望用户能够在视图上滚动并随后移动tableview(就像他在桌面上滚动一样)。但是,如果他点击视图上的按钮,我希望该点击在视图上注册,而不是发送到tableview。现在,我将覆盖视图的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
方法,以便始终返回NO
,这适用于滚动,但具有将所有触摸发送到tableview的效果,使我的按钮无效。我有什么方法可以将滑动/平移手势传递到桌面视图但是保持轻击手势吗?
谢谢,
答案 0 :(得分:8)
不是总是从pointInside返回NO,而是检查点是否与任何UIButton子视图相交 - 如果匹配则返回YES。
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
for ( UIView* sv in self.subviews )
{
if ( CGRectContainsPoint( sv.frame, point) )
return YES;
}
return NO;
}
编辑:替代解决方案
根据您的评论,您希望用户通过其中一个子视图按钮开始滚动UITableView。要使这项工作,您需要使包含按钮的UIView成为UITableView的子视图。
通过这样做,UIView将开始与UITableViewCells一起滚动。为防止这种情况,您需要在滚动发生时调整框架,或者可能使用约束将其锁定到位。
- (void) viewDidLoad
{
[super viewDidLoad];
// instantiate your subview containing buttons. mine is coming from a nib.
UINib* n = [UINib nibWithNibName: @"TSView" bundle: nil];
NSArray* objs = [n instantiateWithOwner: nil options: nil];
_tsv = objs.firstObject;
// add it to the tableview:
[self.tableView addSubview: _tsv];
}
// this is a UIScrollView delegate method - but UITableView IS a UIScrollView...
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[scrollView bringSubviewToFront:_tsv];
CGRect fixedFrame = _tsv.frame;
fixedFrame.origin.y = 100 + scrollView.contentOffset.y;
_tsv.frame = fixedFrame;
}