使用UIPanGestureRecognizer拖动后,必须点击两次以选择UITableViewCell

时间:2012-09-11 10:23:49

标签: iphone uitableview uigesturerecognizer

我有一个名为320x144的小SubViewController.h视图控件,其中有一个UITableView,其中包含3个单元格的单元格。我已经使tableView不可滚动,并且在CALayer的宽限度下在tableView后面添加了一些阴影效果。

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

我使用UIBarButtonItem显示此子视图。在子视图的tableView中选择一个单元格后,我使用一些动画从主视图中消失。

一切正常。

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

在不拖动子视图的情况下,我可以通过单次触摸选择一个单元格,并且视图也会隐藏。

我编写了用于在子视图的didSelectRowAtIndexPath:方法中隐藏子视图的代码。并且我在拖动子视图后第一次选择时没有调用此方法。在第二次点击或触摸时,它被调用。再次,如果用户再次移动子视图,则会出现同样的问题。

当拖动时,子视图的某些属性发生了变化,我无法弄清楚。

2 个答案:

答案 0 :(得分:0)

- (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;
. . .
}

答案 1 :(得分:0)

首先,当你想要显示你的subView时,点击你的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
       }
    }