使用nextResponder触摸基础视图

时间:2011-08-14 21:07:34

标签: iphone objective-c cocoa-touch

目前我正在尝试重新创建Twitter(iPad)类型控件。主要是因为在线提供的所有版本都不适用于我正在开发的应用程序类型,我认为我当然可以做得更好;)(但它比我想象的要难)。

我想要的是什么:

  • 我添加到控件的视图控制器的灵活定位
  • 当我想在我的控件中使用它们时,无需更改我当前的视图控制器(主要是因为我使用iPhone和iPad版本中的视图控制器)。
  • 能够拖动视图控制器,但仍然在视图控制器中保留其功能。

我目前得到了什么:

  • 将视图控制器添加到我的控件中时,它在视图控制器上的定位很好。
  • 能够根据我设定的规则(最大x位置等)拖动视图控制器

我的问题是,当我添加UITableViewController时,我希望能够将其拖动并保持滚动功能并在表格中选择单元格。

我目前的解决方案是,当一个视图控制器被添加到我的控件中时,我向它添加一个子视图(具有相同大小的视图控制器),它接受所有的触摸。然后通过使用委托和调用方法将这些触摸发送到控件。这很好用,接受当我向我的UITableViewController添加子视图时,有一些奇怪的行为。向上和向下滚动仍然可以在UITableViewController中工作,但UITableViewController顶部的View不会检测到这些触摸。选择表格中的单元格不再有效,因为这些触摸是由重叠的UIView拍摄的。

我将覆盖的UIView添加到UITableViewController中,如下所示:

SNOverlayView* layover = [[SNOverlayView alloc] initWithFrame:CGRectMake(0,0, controllerWidth, self.frame.size.height)];
layover.delegate = self;
[controller.view addSubview:layover];
[layover release];

我的自定义叠加UIView包含了几种方法,适用于所有触摸(开始,结束,取消和移动)方法:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([delegate respondsToSelector:@selector(overlayTouchesBegan:touches:event:)])
    [delegate overlayTouchesBegan:self touches:touches event:event];

    NSLog(@"%@", self.nextResponder);   

    [self.nextResponder touchesBegan:touches withEvent:event];
}

根据我从文档中理解的,调用nextResponder,应该确保我视图下面的TableView也接收到触摸。但是这些方法只有在我触摸屏幕一次或向侧面滑动时才会触发。从上到下滑动不会触发这些方法,触摸单元格不会触发UITableViewController中的didSelectRowAtIndexPath。此方法中的self.nextResponder是一个UITableView(由该方法中的NSLog输出)。

我误解了nextResponder部分?不修改我的UITableViewController时这不可能吗?

编辑:我更新了添加到包含所有ViewControllers的主UIView的结构:

|- Root UIView (1)
|-- Containment UIView which detects touches (2)
|---- UITableViewController (3)

问题是现在我的收容视图(2)没有检测到触摸。我将尝试更新我的代码,使其更像下面提到的结构:

|- Root UIView (1)
|-- Containment UIView (2)
|---- UIView detecting touches (4)
|---- UITableViewController  (3)

但我不知道如何让UIView检测触摸。因为当我将UITableViewcontroller(3)添加到我的收容UIView(2)时,它将被放在UIView的顶部,检测触摸(4)并因此“窃取”触摸。我宁愿改变(4)和(3)的顺序。

1 个答案:

答案 0 :(得分:1)

您是否在UITableView中添加了子视图?这很危险,因为它将与单元格一起滚动(UITableView是UIScrollView的子类),并且因为UITableView本身也添加和删除了子视图,所以你无法控制视图所在的顺序。

我认为你最好的选择是拥有像这样的视图层次结构

- containerView (plain UIView, that your UIViewController loads)
|-- overlayView (catches touches)
|-- UITableView

话虽这么说,我怀疑UIScrollViews使用不同的方法来抓取其他UIViews的触摸(即不是touchesBegan:等等)。