iphone - tutorial - uitableviewcell types



UITableView: desplazamiento programático de la vista de contenido (1)

Hola, estoy tratando de reenviar los toques que recibo de una UIView que está delante de una UITableView. Pero doins, así que ya no puedo hacer que la mesa se desplace ( ver aquí ).

Así que ahora estoy tratando de convertir tha tableview scroll programmatically y estoy mirando setContentOffset:animated: y scrollRectToVisible:animated: con éxito solo con el primero.
Aquí está mi código en una clase que subclasifica la UITableView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"BEGTB");
    //previousXPan = 0.0;

    UITouch * touch = [touches anyObject];
    CGPoint tPoint = [touch locationInView:self]; 
    previousYPan = tPoint.y;

    [super touchesBegan:touches withEvent:event];
    //
    //[super touchesShouldBegin:touches withEvent:event inContentView:self];
    //[[self nextResponder] touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch * touch = [touches anyObject];
    CGPoint tPoint = [touch locationInView:self]; 


    NSLog(@"MOVTB");
    NSLog(@"BOUNDZ %f, %f, %f, %f", self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.height, self.bounds.size.width);
    NSLog(@"CONTENT SIZE  %f, %f",  self.contentSize.height, self.contentSize.width);

    CGRect rc = [self bounds];
    NSLog(@"%f %f", rc.size.height, rc.size.width);
    CGRect newRect = CGRectMake(rc.origin.x, rc.origin.y + self.contentSize.height, self.contentSize.width, fabs(tPoint.y - previousYPan));
    NSLog(@"BOND RECT %f, %f, %f, %f", rc.origin.x, rc.origin.y, rc.size.height, rc.size.width);
    NSLog(@"NEW RECT %f, %f, %f, %f", newRect.origin.x, newRect.origin.y, newRect.size.height, newRect.size.width);
    //[self scrollRectToVisible:newRect animated:YES];
    NSLog(@"Content OFFSET %f",tPoint.y - previousYPan);
    [self setContentOffset:CGPointMake(rc.origin.x,(tPoint.y - previousYPan) *2.0 )animated:YES];
    previousYPan = tPoint.y;
    //[super touchesMoved:touches withEvent:event];
    //[[self nextResponder] touchesMoved:touches withEvent:event];
}

Pero el resultado es muy laggy y con errores. ¿Alguna mejor idea?


Casi encuentro una solución adecuada (no es como un desplazamiento normal, pero ...).

Primero determino el número máximo y la cantidad mínima de píxeles en el área de contenido de la vista de tabla en el eje Y (la altura del tamaño del contenido cuando la vista se ha cargado por completo ).

¡Compruebo el movimiento hecho incrementalmente pero no haciendo referencia a la posición del toque en la vista de tabla! Tengo que verificarlo en UIView que lo cubre, porque cuando modificas el offset de contenido de la tabla cambias dinámicamente sus dimensiones y puedes terminar teniendo un efecto de aceleración .

Aquí hay un código:

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

    CGPoint tPoint = [touch locationInView:[viewController draggableAreaView]];



    CGRect rc = [self bounds];


    float totalOS = tPoint.y - previousYPan;
    if ((contentOffSetY >= minY && contentOffSetY <= maxY) ||
        (contentOffSetY < minY - 5 && totalOS < 0) ||
        (contentOffSetY > maxY + 5 && totalOS > 0))
    {

        if (totalOS > 0)
            totalOS += OFFSET;
        else if (totalOS < 0)
            totalOS -= OFFSET;
        [self setContentOffset:CGPointMake(rc.origin.x,self.contentOffset.y + totalOS)animated:NO];

    }
    else /*if (contentOffSetY < minY - 5 && totalOS < 0) */
    {
        [self resetOffset];
    }
    previousYPan = tPoint.y; 

}

- (void)resetOffset{

    CGRect rc = [self bounds];
    if(contentOffSetY < minY)
    {
        [self setContentOffset:CGPointMake(rc.origin.x, minY + 50)animated:YES];
    }
    else if (contentOffSetY > maxY)
    {
        [self setContentOffset:CGPointMake(rc.origin.x, maxY - 50)animated:YES];
    }
}

Algunos consejos más:

  • aquí draggableAreaView es la UIView superior desde la cual obtengo una posición "absoluta"
  • OFFSET es una constante definida para incrementar linealmente la velocidad del scroolling (sin ella el touchesMoved: llamado muchas veces, da un movimiento relativo de solo un pixel cada vez)
  • , minY y maxY son los valores límite precalculados (para calcularlos maxY la altura de todas las celdas en la tabla para max y la altura de la vista de contenido visible para min)
  • minY algunos desplazamientos a minY y maxY para tener una animación más visible




touch