0

我有一个带有子视图的视图,这些子视图是 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;
}

现在我想知道我用以下方法用touchEvents指向什么样的UIView,但在日志中指针“vista”只能识别self类或UIView类,有什么方法可以识别子类“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];
        }
    }
}
4

1 回答 1

1

解决了,有步骤

  1. 在主视图中只留下了与触摸交互的代码以及它在哪里。

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”是指向超级视图的指针,“seleccion:”是突出显示它自己的视图的方法。

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;
}
于 2012-10-02T00:29:15.820 回答