cocoa touch hitTest withEvent可以识别UIView的子类

时间:2012-09-30 22:38:52

标签: cocoa-touch ios5 uiview uiresponder

我有一个带有子视图的视图,这些子视图是UIView的子类,在示例中,子类称为ESDcelda

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UIImage *img = [UIImage imageNamed:@"lgrey091.gif"];
        [self setBackgroundColor:[UIColor colorWithPatternImage:img]];

        ESDcelda *cel1 = [[ESDcelda alloc] initWithTipo:1];
        [cel1 setFrame:CGRectMake(100, 100, cel1.frame.size.width, cel1.frame.size.height)];
        [self addSubview:cel1];

        cel1 = [[ESDcelda alloc] initWithTipo:2];
        [cel1 setFrame:CGRectMake(300, 100, cel1.frame.size.width, cel1.frame.size.height)];
        [self addSubview:cel1];
    }
    return self;
}

现在我想知道我用touchMvents用以下方法指向什么样的UIView但是在日志中指针“vista”只识别self类或UIView类,有什么方法可以识别subClass“celdaSel”?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[touches allObjects] objectAtIndex:0];

    [self perfTouch:touch];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[touches allObjects] objectAtIndex:0];

    [self perfTouch:touch];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[touches allObjects] objectAtIndex:0];

    [self perfTouch:touch];
}

-(void)perfTouch:(UITouch *)touch
{
    CGPoint punto = [touch locationInView:self];

    UIView *vista = (ESDcelda *)[self hitTest:punto withEvent:nil];

    if (![vista isKindOfClass:[self class]])
    {
        celdaSel = (ESDcelda *)vista;
        [celdaSel seleccion:YES];
    }
    else
    {
        if (celdaSel != nil)
        {
            [celdaSel seleccion:NO];
        }
    }
}

1 个答案:

答案 0 :(得分:1)

解决了,有步骤

  1. 在主视图中,只留下了与触摸相关的代码以及它在哪里。
  2. v

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [[touches allObjects] objectAtIndex:0];
    
        [self perfTouch:touch];
    }
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [[touches allObjects] objectAtIndex:0];
    
        [self perfTouch:touch];
    }
    
    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [[touches allObjects] objectAtIndex:0];
    
        [self perfTouch:touch];
    
        if (self.celdaSel != nil)
        {
            NSLog(@"%d",self.celdaSel.elemento);
        }
    }
    
    -(void)perfTouch:(UITouch *)touch
    {
        CGPoint punto = [touch locationInView:self];
    
        [self hitTest:punto withEvent:nil];
    
    }
    
    1. 在名为ESDCelda的UIView子类中,我覆盖pointInside:withEvent方法以了解当前单个触摸是否在视图上,“inter”是让我知道触摸是否在视图上的变量,“seleccionada”表示是否视图突出显示,“conten”是指向superview的指针,“seleccion:”是突出显示自身视图的方法。
    2. v

      -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
      {
          BOOL inter = [super pointInside:point withEvent:event];
          if (inter)
          {
              //NSLog(@"%i, %@", inter, self);
              if (!self.selecionada)
              {
                  [self seleccion:YES];
                  if (self.conten.celdaSel != nil)
                      [self.conten.celdaSel seleccion:NO];
                  [self.conten setCeldaSel:self];
              }
          }
          else
          {
              if (self.selecionada)
              {
                  [self seleccion:NO];
                  [self.conten setCeldaSel:nil];
              }
          }
          return inter;
      }