【问题标题】:UIView on top of UIScrollview, pass through only scrolls, not tapsUIView 在 UIScrollview 之上,只通过滚动,不通过点击
【发布时间】:2014-04-27 20:22:51
【问题描述】:

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

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

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

谢谢,

【问题讨论】:

  • 为什么不能将该视图设置为 tableHeaderView?

标签: ios iphone objective-c uitableview uiscrollview


【解决方案1】:

不要总是从 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;
}

【讨论】:

  • 谢谢汤姆。这工作得很好,除了一个问题。在带有按钮的普通 tableview 上,如果您将手指放在按钮上然后快速滚动,则按钮操作将被覆盖并注册滑动。在您上面提到的情况下,如果我尝试做同样的事情,滚动永远不会被注册。有没有办法做到这一点,如果滚动速度快于某个值,也许返回 NO?
  • @KyleRosenbluth - 我想我明白你在追求什么。我更新了解决方案来解决这个问题。
  • 我打算创建一个答案,但汤姆的编辑打败了我。无论如何,这里有一个要点表明在工作中:gist.github.com/mnmaraes/3dfae9ed353fe49e9d0b
  • @TomSwift 我只是不明白你为什么说仍然需要覆盖 pointInside:withEvent:。滚动视图应该能够在视图中选择那些滚动手势。
  • @TomSwift,您似乎错过了一件小事。在我实施您的建议后,滚动工作正常,但按钮没有响应触摸。我猜随着其他单元格被添加到屏幕上,视图会退回到子视图索引中。通过在scrollViewDidScroll 的特殊视图上调用bringSubviewToFront:,我解决了这个问题。
猜你喜欢
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多