【问题标题】:Have to tap twice to select an UITableViewCell after dragging with UIPanGestureRecognizer使用 UIPanGestureRecognizer 拖动后必须点击两次才能选择 UITableViewCell
【发布时间】:2012-09-11 10:23:49
【问题描述】:

我有一个名为SubViewController.h 的小型320x144viewcontroller,其中有一个UITableView,其中包含3 个单元格和一个部分。我已经使 tableView 不可滚动,并且还通过CALayer 的恩典在 tableView 后面放置了一些阴影效果。

在另一个名为 MainViewController.m 的视图控制器中,我已将 SubViewController.h 作为子视图添加到此 MainViewController。使用UIPanGestureRecognizer 我已经成功地将SubViewContoller 拖到我想要的任何地方。

我使用UIBarButtonItem 使这个子视图可见。在子视图的 tableView 中选择一个单元格后,我通过一些动画使它从主视图中消失。

一切正常。

但是当我拖动子视图然后尝试选择一个单元格时,我必须点击该单元格两次。在第一次点击时,除了单元格变为蓝色(就像您在 tableView 中选择一个单元格时通常发生的那样),实际上什么都没有发生,但没有隐藏。如果我再次点击它就会隐藏起来。

无需拖动子视图,我只需轻轻一按即可选择一个单元格,并且视图也会隐藏。

我已经在子视图的didSelectRowAtIndexPath: 方法中编写了隐藏子视图的代码。我已经检查过,当我在拖动子视图后第一次选择时不会调用此方法。在第二次点击或触摸时,它会被调用。如果用户再次移动子视图,也会出现同样的问题。

肯定是子视图的某些属性在拖动后发生了变化,我无法弄清楚。

【问题讨论】:

    标签: iphone uitableview uigesturerecognizer


    【解决方案1】:
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
        UITouch *touch = [touches anyObject];
    
        NSUInteger tapCount = [touch tapCount];
    
        switch (tapCount) {
            case 1:
                [self performSelector:@selector(singleTapMethod) withObject:nil afterDelay:.4];
                break;
            case 2:
                [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapMethod) object:nil];
                [self performSelector:@selector(doubleTapMethod) withObject:nil afterDelay:.4];
                break;
    . . .
    }
    

    【讨论】:

    • 这不是我所期望的。我确定我必须在 UIGestureRecocgnizerStateEnded 时写一些东西..
    【解决方案2】:

    首先,当您希望显示您的子视图时,即点击您的 UIBarButtonItem:

    -(IBAction)buttonClick
    {
            //setup ur view dynamically as you like//
            PSview=[[UIView alloc]initWithFrame:CGRectMake(5, 5, 310,450)];
            PSview.backgroundColor=[UIColor blackColor];
            PSview.alpha=0.8;
            [PSview.layer setBorderColor: [[UIColor whiteColor] CGColor]];
            [PSview.layer setBorderWidth: 3.0];
    
    
        PSview.contentMode=UIViewContentModeScaleAspectFill;
        PSview.clipsToBounds=YES;
        [PSview.layer setBorderColor: [[UIColor whiteColor] CGColor]];
        [PSview.layer setBorderWidth: 3.0];
    
        [PSview addSubview:subView];
        [self.view addSubview:PSview]; 
    

    }

    然后:

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
        {
    //since there are two tables in one view, you can differentiate them using if()
         if(tableView==subView) 
            {
                // ...ur code . ..
                // write your code what needs to happen when you click a row of your subView.
                [PSview removeFromSuperview];
            }
        if(tableView==mainView)
           {
          // write your code , what happens when user clicks row of the main table
           }
        }
    

    【讨论】:

    • 您能详细说明一下您的观点吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多