【问题标题】:touches not recognized on tableview when contentOffset set to a negative value当 contentOffset 设置为负值时,在 tableview 上无法识别触摸
【发布时间】:2015-01-15 04:39:21
【问题描述】:

我有一个表格视图,我正在使用addSubview: 将子视图直接添加到表格视图中。我在CGRectMake(0.0f, -30.0f, tableView.frame.size.width, 30.0f) 位置显示此视图(因此,当用户滚动稍微超出滚动区域的边界时,它显示在表格的可滚动区域上方)。然后我这样做:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {
    if(scrollView.contentInset.top + scrollView.contentOffset.y < -30.0f) {
        [scrollView setContentOffset:CGPointMake(1.0f, -30.0f)-scrollView.contentInset.top animated:NO];
    }
}

这样当用户向上滚动并进入表格视图中的负空间时,当他们释放时,他们仍然可以看到我在 y=-30 处插入的视图,这样表格就不会“回弹”到 0 .

这一切都完全按照我的意愿工作。但是,当表格的 contentOffset 设置为负 y 值(例如 [scrollView setContentOffset:CGPointMake(1.0f, -30.0f)-scrollView.contentInset.top animated:NO])时,我的表格的两个单元格以及我直接插入表格的视图都无法识别触摸。我想知道如何将 contentOffset 设置为这样的值,并且仍然有我的 tableView 的子视图,以及单元格,注册触摸。

【问题讨论】:

    标签: ios objective-c uitableview uiscrollview


    【解决方案1】:

    30.0f 添加到contentInset.top 可能更容易,这样您就可以继续使用库存表视图。

    如果您仍想使用您概述的方法,则需要在 UITableView 子类中覆盖 hitTest:withEvent:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
        if (CGRectContainsPoint(self.theViewInQuestion.frame, point)) {
            return self.theViewInQuestion;
        }
    
        return [super hitTest:point withEvent:event];
    }
    

    默认情况下,iOS 视图不会响应超出其边界的触摸,因此代码所做的就是告诉事件处理系统您认为 theViewInQuestion 位于表格内部,即使它位于原点之上且不在界限。

    Event handling for iOS - how hitTest:withEvent: and pointInside:withEvent: are related?”有一些关于系统如何工作的很好的答案,如果你想了解更多细节。

    【讨论】:

      猜你喜欢
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多