0

正如苹果文件所说,处理手势的过程是

  1. 初始视图尝试处理事件或消息。如果它无法处理该事件,它会将事件传递给它的父视图,因为初始视图不是其视图控制器的视图层次结构中最顶层的视图。

  2. 超级视图尝试处理该事件。如果父视图不能处理事件,它会将事件传递给它的父视图,因为它仍然不是视图层次结构中最顶层的视图。

  3. 视图控制器的视图层次结构中的最顶层视图尝试处理该事件。如果最顶层的视图无法处理该事件,它会将事件传递给它的视图控制器。

  4. 视图控制器尝试处理事件,如果不能,则将事件传递给窗口。

  5. 如果窗口对象无法处理事件,它会将事件传递给单例应用程序对象。

  6. 如果应用程序对象无法处理该事件,它会丢弃该事件。

但是,在我的情况下,我有一个UITableViewController 的子类作为 window 的根 vc,并添加一个视图以覆盖整个屏幕,如下所示:

@interface MyTableViewController : UITableViewController()
@end

@implementation MyTableViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *redView = [[UIView alloc] initWithFrame:self.view.bounds];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
}

我认为如果我触摸屏幕生成平移手势,redView 将是命中测试视图,并且由于 redView 无法处理它,它会将触摸事件传递给它的超级视图,它也是 tableView 的超级视图. 结果,tableview 将无法处理平移手势。但是,tableView 仍然可以处理平移手势,有人可以解释一下吗?

4

2 回答 2

2

如果您的视图控制器是 a UITableViewController, the superviewofredView将是 the UITableView,因此当redView不处理手势时,它会传递给它的superview,因此UITableView接收(并处理)手势。

于 2013-07-22T15:53:20.647 回答
1

如果有人仍在寻找更简单的解决方案,那就是: UItableView 有一个名为 panGestureRecognizer 的属性,因此在上视图中您只需编写以下代码:

    [self.upperView addGestureRecognizer:self.tableView.panGestureRecognizer];

所以表格滚动事件被传递给表格视图

于 2015-07-29T07:39:25.033 回答