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」は自己クラスまたは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 に答える