Pregunta sobre customization, ios, objective-c, uitableview – Cambio del color de UITableViewCellDeleteConfirmationControl (botón Eliminar) en UITableViewCell

4

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

Ahora, todo lo que necesito es cambiar el color de este botón, no quiero cambiar el comportamiento, o hacerlo totalmente personalizado. 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!

No creo que esto sea posible sin una subclase UITableViewCell personalizada. ¿Por qué estás seguro de que es posible? DrummerB
@DrummerB Leí mucho sobre la personalización de este botón, obviamente mi celda es personalizada, ya estoy subclasificando UITableViewCell, pero no entiendo cómo simplemente cambiar el color, la mayoría de las veces la gente quiere cambiar la animación o la vista completa. de este botón. Anatoliy Gatt
@DrummerB No quiero cambiar ningún comportamiento, solo color. Anatoliy Gatt
No tengo conocimiento de ninguna forma (documentada) de acceso a ese botón. La única forma de personalizarlo es configurando su texto. Puede intentar recorrer todas las subvistas de la celda e intentar encontrar el botón (¡una solución muy mala y poco flexible!) Pero incluso si lo encuentra, UIButton no tiene una propiedad de tinte. Tendría que crear su imagen de fondo tintada elástica en el software de edición de imágenes que elija. DrummerB

Tu respuesta

6   la respuesta
2

seis meses después, ha aparecido iOS 8 y ya no funciona correctamente.

Ahora, necesitas buscar una subvista llamada "_UITableViewCellActionButton"y establecer el color de fondo de eso.

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

Enalgunos de miUITableView células, no quería que el usuario pudiera deslizar para eliminar, perohizo quiere que aparezca algo (un ícono de un candado) cuando se pasa.

Para ello, agregué unbReadOnly variable a mi clase UITableViewCell

@interface NoteTableViewCell : UITableViewCell

. . . 

@property (nonatomic) bool bReadOnly;

-(void)overrideConfirmationButtonColor;

@end

y agregué el código de silyevsk a mi archivo .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 laUITableViewDe lo contrario, la etiqueta "Eliminar" también aparecerá como el icono 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 se presente iOS 9.

1

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];
        }
    }
}
Este enfoque debe modificarse para iOS 7. Vea mi respuesta más arriba, así comostackoverflow.com/a/22350817/1758337 timothykc
4

- (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 la 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.

¡Increíble! funciona muy bien para mi marmor
1

pero extendiendo 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
no funciona después de iOS 7.1.2 yatanadam
Este enfoque funciona. Es posible que deba agregar esto al UITableViewController para que se muestre el color personalizado sin embargo ... - (void) tableView: (UITableView *) tableView willBeginEditingRowAtIndexPath: (NSIndexPath *) indexPath {[self.yourTableView reloadData]; } timothykc
no funciona para mi Ans
2

activar el botón de eliminar al deslizar

// asegúrese de tener los siguientes métodos en el controlador uitableviewcontroller

- (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.");
}

establecer etiqueta de texto personalizado en lugar de eliminar.

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

establezca el color personalizado para la parte 1 del botón: advertencia, esto implica técnicamente tocar la API privada de Apple. Sin embargo, no se le impide modificar una subvista utilizando una búsqueda de método público que forma parte de UIKIT.

Cree una clase uitableviewcell (vea tambiénhttps://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 ten cuidado con mencionar o usar lo privado.UITableViewCellDeleteConfirmationView clase puede llevar al rechazo de AppStore.

Establecer color personalizado para el botón parte 2

de vuelta en su uitableviewcontroller

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

(No se llamará al color alternativo hasta la próxima vez que se llame a layoutSubviews en el mantel, por lo que nos aseguramos de que esto suceda recargando todo).

5

puede cambiar su apariencia fácilmente.

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

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

Por supuesto, debes tener cuidado de hacer este tipo de cosas ya que es bastante frágil. Yo sugeriría que ruedes tu propio lugar.

Sugeriríaenviar un informe de error a Apple para solicitar la posibilidad de editar esto más fácilmente.

Oh, finalmente encontré la solución, ahora publicaría el código) Anatoliy Gatt
Pero no veo ningún resultado, incluso cuando intento agregar una subvista como el botón, no lo hará, pero UILabel encaja perfectamente allí. Anatoliy Gatt
Yo actualizaría la publicación ahora, para que pueda ver lo que he hecho. Anatoliy Gatt

Preguntas relacionadas