为什么UITableView会获得平移手势?

时间:2013-07-22 15:25:21

标签: ios uigesturerecognizer

正如Apple文档所说,处理手势的过程是

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

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

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

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

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

  6. 如果app对象无法处理该事件,则会丢弃该事件。

  7. 但是,在我的情况下,我有一个 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仍然可以处理平移手势,任何人都可以解释它吗?

2 个答案:

答案 0 :(得分:2)

如果您的视图控制器是UITableViewController,则superview的{​​{1}}将是redView,因此当UITableView无法处理此手势时,它传递给redView,因此superview接收(并处理)手势。

答案 1 :(得分:1)

如果有人还在寻找更简单的解决方案,那就是: UItableView有一个名为panGestureRecognizer的属性,所以在上面的视图中你只需编写这段代码:

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

因此表滚动事件将传递给表视图