UIView小于另一个UIView

时间:2011-10-25 19:52:57

标签: cocoa-touch

我有一个UIView高30,比我添加一个UITableView作为子视图,其中30作为origin.y。因为表保持在主视图“下”,所以我无法选择单元格。因此我实施了这种方法:

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Tocco intercettato");
    if (oldSet && oldEvent) {
        [table touchesEnded:oldSet withEvent:oldEvent];
    }
    oldSet = touches;
    oldEvent = event;
    [table touchesBegan:touches withEvent:event];
    [table touchesEnded:touches withEvent:event];
    }

水龙头工作,但幻灯片不起作用,因此我无法滑动桌子。一些想法才能解决?

1 个答案:

答案 0 :(得分:1)

将覆盖的UIView的触摸传递到底层的UITableView不起作用(正如您所看到的,点击通过而不是滚动动作)。这是因为UITableView(作为UIScrollView的子类)用响应者链做各种各样的引擎式怪异(你的代码也有点奇怪,你可以从上面的视图的touchesBegan方法调用touchesBegan和touchesEnded,但是这个不是为什么你不能滚动表格。)

实现所需内容的一种简单方法(假设我已正确理解)是覆盖覆盖视图上的hitTest:withEvent:方法并让方法返回基础UITableView(而不是self ,这是默认实现):

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UITableView *tv = (UITableView *)[self.superview.subviews objectAtIndex:0];
    return tv;
}

请注意,此代码假定UITableView是添加到视图控制器的第一个视图,之后添加了覆盖的UIView

编辑:好的,重新阅读您的问题后,我想我理解您的问题。您有一个高度为30的主视图,并且在该视图中,您在y = 30处添加了一个UITableView。我认为将此方法添加到主视图中将满足您的需求:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (point.y < self.frame.size.height) {
        return self;
    } else {
        return myTableView; // assumes myTableView is a reference to the
                            // UITableView that you've added
    }
}

基本上,如果操作系统超出了主视图的范围,则告诉操作系统将所有触摸传递给myTableView

然而,更简单的方法是将30像素高的主视图(橙色的东西)和UITableView都添加为另一个视图(或视图控制器)的子视图。这样,您就不必做任何事情来使您的表格像普通表一样。