正如Apple文档所说,处理手势的过程是
初始视图尝试处理事件或消息。如果它无法处理事件,它会将事件传递给其superview,因为初始视图不是其视图控制器视图层次结构中的最顶层视图。
superview尝试处理该事件。如果superview无法处理事件,它会将事件传递给superview,因为它仍然不是视图层次结构中最顶层的视图。
视图控制器视图层次结构中的最顶层视图尝试处理该事件。如果最顶层的视图无法处理该事件,它会将事件传递给其视图控制器。
视图控制器尝试处理事件,如果不能,则将事件传递给窗口。
如果窗口对象无法处理事件,它会将事件传递给单例应用程序对象。
如果app对象无法处理该事件,则会丢弃该事件。
但是,在我的情况下,我有一个 UITableViewController的子类作为窗口的根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仍然可以处理平移手势,任何人都可以解释它吗?
答案 0 :(得分:2)
如果您的视图控制器是UITableViewController
,则superview
的{{1}}将是redView
,因此当UITableView
无法处理此手势时,它传递给redView
,因此superview
接收(并处理)手势。
答案 1 :(得分:1)
如果有人还在寻找更简单的解决方案,那就是: UItableView有一个名为panGestureRecognizer的属性,所以在上面的视图中你只需编写这段代码:
[self.upperView addGestureRecognizer:self.tableView.panGestureRecognizer];
因此表滚动事件将传递给表视图