UIVc在UIScrollview之上,只通过滚动而不是点击

Kyl*_*uth 5 iphone objective-c uitableview uiscrollview ios

我有一个UITableview子类UIVIew在表的一部分之上,如下所示:

-uitable-- |--uiview-| || || || || |---------| | | | | -----------

该视图与tableview具有相同的superview,但部分涵盖了tableview.上面有几个按钮UIView.我希望用户能够在视图上滚动并随后移动tableview(就像他在桌面上滚动一样).但是,如果他点击视图上的按钮,我希望该点击在视图上注册,而不是发送到tableview.现在,我重写了视图的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event方法,总是返回NO,这适用于滚动,但具有将所有触摸发送到tableview的效果,使我的按钮无效.我有什么方法可以将滑动/平移手势传递到桌面视图,但保持轻敲手势?

谢谢,

Tom*_*ift 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:替代解决方案

根据您的评论,您希望用户通过其中一个子视图按钮开始滚动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;
}
Run Code Online (Sandbox Code Playgroud)