2011-04-19 7 views
6

He hecho una UITableViewCell personalizada, y la he hecho correctamente (agregando todo a contentView, y anulando layoutSubviews por lo que mis subvistas son relativas a contentView.bounds).¿Cómo puedo cambiar la cantidad de sangría en mi UITableViewCell personalizado mientras edito?

Cuando el usuario presiona el botón Editar, la tabla sangra para dejar espacio para el signo de borrar rojo. Esto está bien, pero la cantidad predeterminada de sangría es demasiado, y arruina el aspecto de mi celda personalizada. ¿Cómo puedo reducir la cantidad de sangría? setIndentationLevel y tableView:IndentationLevelForRowAtIndexPath no parecen hacer nada.

(Alguien hizo una pregunta similar here, pero nunca se resolvió).

+0

¿Encontró alguna solución? Estoy sufriendo el mismo problema. Gracias. – harshitgupta

Respuesta

15

Tiene que anular layoutSubviews y hacer algo como lo siguiente. Y no olvide configurar el nivel de sangría en algo mayor que 0 :) Para las celdas personalizadas, el nivel de sangría no se aplica de manera predeterminada.

Para evitar la sangría de un solo golpe para eliminar el gesto, tendrá que hacer un pero más trabajo. Hay un estado que refleja el estado de edición de la celda. No es público, pero se puede acceder con - (void)willTransitionToState:(UITableViewCellStateMask)aState, por lo que almacenarlo en una propiedad hace el trabajo para layoutViews.

documentación de Apple para willTransitionToState:

Tenga en cuenta que cuando el usuario pasa de una célula suprimirlo, las transiciones celulares para el estado identificado por el UITableViewCellStateShowingDeleteConfirmationMask constante pero el UITableViewCellStateShowingEditControlMask es no establecido.

archivo de cabecera

int state; 

... 

@property (nonatomic) int state; 

... 

implantación de células

@synthesize state; 

... 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.contentView.frame = CGRectMake(0,           
             self.contentView.frame.origin.y, 
             self.contentView.frame.size.width, 
             self.contentView.frame.size.height); 

    if (self.editing 
     && ((state & UITableViewCellStateShowingEditControlMask) 
     && !(state & UITableViewCellStateShowingDeleteConfirmationMask)) || 
      ((state & UITableViewCellStateShowingEditControlMask) 
     && (state & UITableViewCellStateShowingDeleteConfirmationMask))) 
    { 
     float indentPoints = self.indentationLevel * self.indentationWidth; 

     self.contentView.frame = CGRectMake(indentPoints, 
              self.contentView.frame.origin.y, 
              self.contentView.frame.size.width - indentPoints, 
              self.contentView.frame.size.height);  
    } 
} 

- (void)willTransitionToState:(UITableViewCellStateMask)aState 
{ 
    [super willTransitionToState:aState]; 
    self.state = aState; 
} 
+0

Funcionó perfectamente. ¡Gracias! –

+0

Ah ... He notado un problema. La sangría es la misma cantidad si el usuario presiona el botón editar o desliza para eliminar. ¿Hay alguna forma de interceptar el deslizamiento para eliminar y decirle que haga algo diferente? –

+0

Ah ok, acabo de editar mi código y proporcioné una solución simple. Echar un vistazo. –

1

respuesta actualizada de Nick Weaver funciona muy bien, excepto por el tema que Rec Levy señaló:

Lo único que ahora es que cuando pase a borrar y luego cancelar (haga clic en otra parte de la pantalla) la célula se salta de repente a la izquierda y luego se desliza hacia atrás como el botón de borrar desaparece

me encontré con el el mismo problema. No estoy seguro de por qué ocurre, pero deshabilitar las animaciones al configurar el marco contentView lo resuelve.

... 
[UIView setAnimationsEnabled:NO]; 
self.contentView.frame = CGRectMake(indentPoints, 
             self.contentView.frame.origin.y, 
             self.contentView.frame.size.width - indentPoints, 
             self.contentView.frame.size.height); 
[UIView setAnimationsEnabled:YES]; 
Cuestiones relacionadas