触摸UITableView的backgroundView上的事件

时间:2013-12-07 18:12:39

标签: ios iphone objective-c uitableview touch

我有一个UITableViewControllertableView的视图为backgroundView(更多,它是MKMapView),设置为

self.tableView.backgroundView = _mapView;

目前,屏幕上显示背景视图(我还有一个透明的表头来实现这一点)。我无法让mapViewtableView'backgroundView)回复用户互动。我的表头,在地图视图上方,是UIView的子类,具有以下覆盖:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    LogDebug(@"Clic en transparent view");
    if (_transparent)
    {
        return nil;
    }
    return [super hitTest:point withEvent:event];
}

所以它应该通过事件;我不知道什么是错的,并且在其他类似的问题中找不到任何解决方案。

必须将mapView保留为tableView的背景属性,所以请考虑到这一点。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

回答这个问题已经相对较晚了。但是我在自己的项目中遇到了这个问题,经过一些研究后我得到了答案。首先,我没有将视图分配给tableView.backgroundView。相反,我使tableView.backgroundColor透明,然后在表视图下放置另一个视图。

编辑: 在"桌下"我的意思是tableViewanotherView是同一父视图的子项,tableView.zPosition大于anotherView.zPosition

然后我所做的就是覆盖tableView

(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

tableView避免保留不在其单元格中的事件。

以下是代码:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

    /// the height of the table itself.
    float height = self.bounds.size.height + self.contentOffset.y;
    /// the bounds of the table. 
    /// it's strange that the origin of the table view is actually the top-left of the table.
    CGRect tableBounds = CGRectMake(0, 0, self.bounds.size.width, height);
    return CGRectContainsPoint(tableBounds, point);

}

它对我来说就像一个魅力。希望它能帮助遇到这个问题的任何其他人。

答案 1 :(得分:0)

我猜测touchEvents无法传递给tableView的backgroundView。 所以,我做的是,

对于作为UIVIEW的子类的headerView,我添加了一个类属性作为mapView。 在 HeaderView.h

@property (nonatomic,assign) UIView *mapView;

并且,在 tableViewController

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    HeaderView *view =[[TestView alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
    view.mapView =tableView.backgroundView;
    return view;
}

并在HeaderView中覆盖hitTest并返回此mapView。

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    return self.mapView;
}

现在mapView接收到touchEvent并相应地做出响应。
。添加您可能感兴趣的额外代码。 希望这会有所帮助。

答案 2 :(得分:0)

Santhu的答案几乎对我有用,我将测试通过mapView而不是仅仅返回它,我还需要进行点检查,因为我只想通过标题触摸事件,所以在HeaderView上有我的版本的命中测试:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    if(point.y > self.frame.size.height){
        return nil;
    }
    return [self.mapView hitTest:point withEvent:event];
}

答案 3 :(得分:0)

将它放在UITableView子类中,缺点是你不能再点击单元格,但希望它是一个指向正确方向的指针。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{}

答案 4 :(得分:0)

仅供参考,这是一篇旧文章,并且UITableView.backgroundView现在确实得到了润色。因此,如果您的backgroundView中的内容没有收到触摸,则是由于其他一些问题。