Cambiar el color de UITableViewCellDeleteConfirmationControl (Botón Eliminar) en UITableViewCell

Actualmente estoy tratando de personalizar el button delte en UITableViewCell. Ahora tengo algo así:

introduzca la descripción de la imagen aquí

Ahora, todo lo que necesito es cambiar el color de este button, no quiero cambiar el comportamiento ni convertirlo en una opción personalizada. Estoy seguro de que es posible, sin crear sus propios controles para eliminar filas en UITableView.

Este mi código:

- (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0]; deleteButtonView.backgroundColor = [UIColor greenColor]; } } } 

¿Cómo podría hacer esto?

¡Gracias por adelantado!

UITableViewCellDeleteConfirmationControl no es una class pública y no puede cambiar fácilmente su apariencia.

Para hacerlo, creo que tendrías que recorrer las subvistas de la celda y cambiar sus properties:

 for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") { // Set the background using an image. } } 

Por supuesto, debe tener cuidado de hacer este tipo de cosas, ya que es bastante frágil. Sugeriría rodar su propio lugar.

Sugiero enviar un informe de error a Apple para solicitar la posibilidad de editar esto más fácilmente.

En la subclass UITableViewCell:

 - (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view { for(UIView *subview in view.subviews) { if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview; UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview]; if(recursiveResult) return recursiveResult; } return nil; } -(void)overrideConfirmationButtonColor { dispatch_async(dispatch_get_main_queue(), ^{ UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self]; if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor]; }); } 

Luego en UITableViewDelegate:

 -(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { <#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath]; [cell overrideConfirmationButtonColor]; } 

Esto funciona en iOS 7.1.2

A continuación, se explica cómo:

activar el button Eliminar al deslizar

// asegúrese de tener los siguientes methods en el controller de vista adecuado

 - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"You hit the delete button."); } 

Establezca una label personalizada de text en lugar de eliminarla.

 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"Your Label"; } 

Configura el color personalizado para la parte 1 del button: advertencia, esto implica técnicamente meterse en la API privada de Apple. Sin embargo, no se le impide modificar una subvista mediante una búsqueda de método público que forma parte de UIKIT.

Cree una class uitableviewcell (consulte también https://stackoverflow.com/a/22350817/1758337 )

 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { //iterate through subviews until you find the right one... for(UIView *subview2 in subview.subviews){ if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { //your color ((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor]; } } } } 

Otra nota: no hay garantía de que este enfoque funcione en futuras actualizaciones. También tenga cuidado de que mencionar o usar la class UITableViewCellDeleteConfirmationView privada puede llevar al rechazo de AppStore.

Configurar el color personalizado para la parte 2 del button.

de vuelta en su controller adecuado

 - (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { [YourTableView reloadData]; } 

(El color alternativo no se llamará hasta la próxima vez que se invoque layoutSubviews en la tablecel, por lo que nos aseguramos de que esto ocurra volviendo a cargar todo).

El ejemplo de Silyevsk es excelente … pero, seis meses después, iOS 8 ha aparecido, y ya no funciona correctamente.

Ahora, debe search una subvista llamada " _UITableViewCellActionButton " y establecer el color de background de eso.

A continuación se muestra una versión modificada del código de silyevsk que he usado en mi aplicación.

En algunas de mis células UITableView , no quería que el usuario pudiera deslizar-para-borrar, pero quería que apareciera algo (un ícono de candado) cuando se deslizaron.

introduzca la descripción de la imagen aquí

Para hacer esto, agregué una variable bReadOnly a mi class UITableViewCell

 @interface NoteTableViewCell : UITableViewCell . . . @property (nonatomic) bool bReadOnly; -(void)overrideConfirmationButtonColor; @end 

y agregué el código silyevsk a mi file .m:

 - (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view { for(UIView *subview in view.subviews) { if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound) return subview; UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview]; if(recursiveResult) return recursiveResult; } return nil; } -(void)overrideConfirmationButtonColor { if (!bReadOnly) return; dispatch_async(dispatch_get_main_queue(), ^{ UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self]; if(confirmationButton) { confirmationButton.backgroundColor = [UIColor lightGrayColor]; UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame]; imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"]; imgPadLock.contentMode = UIViewContentModeCenter; // Don't stretch the UIImage in our UIImageView // Add this new UIImageView in the UIView which contains our Delete button UIView* parent = [confirmationButton superview]; [parent addSubview:imgPadLock]; } }); } 

Además, necesitaba cambiar el código que llena el UITableView ; de lo contrario, la label "Eliminar" aparecerá así como el ícono del candado:

 -(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { Note* note = [listOfNotes objectAtIndex:indexPath.row]; if ( /* Is the user is allowed to delete this cell..? */ ) return @"Delete"; return @" "; } 

Sigue siendo feo, y se basa en suposiciones de que esto no cambiará todo cuando llegue iOS 9.

Esta es la solución:

 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) { UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0]; UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]]; [deleteButtonView addSubview:image]; } } } 

Respuesta compatible con IOS7 (no se crea una class personalizada, sino que se amplía el UITableViewCell:

 @implementation UITableViewCell (customdelete) - (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { for(UIView *subview2 in subview.subviews){ if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { ((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED; //YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT } } } } @end 
Intereting Posts