Pergunta sobre customization, objective-c, uitableview, ios – Alterar a cor do UITableViewCellDeleteConfirmationControl (botão Excluir) no UITableViewCell

4

Atualmente estou tentando personalizar o botão delte no UITableViewCell. Agora eu tenho algo assim:

Agora, tudo que eu preciso é mudar a cor deste botão, eu não quero mudar o comportamento, ou torná-lo totalmente personalizado. Tenho certeza de que é possível, sem criar seus próprios controles para excluir linhas no UITableView.

Este meu 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];
        }
    }
}

Como eu pude fazer isso?

Desde já, obrigado!

Eu não acho que isso é possível sem uma subclasse UITableViewCell personalizada. Por que você tem certeza de que é possível? DrummerB
Não tenho conhecimento de nenhuma maneira (documentada) de acessar esse botão. A única maneira de personalizá-lo é definindo seu texto. Você poderia tentar iterar através de todas as subvisualizações da célula e tentar encontrar o botão (solução muito ruim e inflexível!) Mas, mesmo que você o encontre, o UIButton não possui uma propriedade de tonalidade. Você teria que criar sua imagem de fundo alongada e esticada no software de edição de imagem de sua escolha. DrummerB
@DrummerB Eu não quero mudar nenhum comportamento, apenas cor. Anatoliy Gatt
@DrummerB Eu li muito sobre a personalização deste botão, obviamente, meu celular é personalizado, eu já estou subclassificando UITableViewCell, mas eu não entendo como simplesmente mudar a cor, na maioria das vezes as pessoas querem mudar a animação ou toda a visão deste botão. Anatoliy Gatt

Sua resposta

6   a resposta
1

mas estendendo a 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
não funciona depois do ios 7.1.2 yatanadam
não funciona para mim Ans
Essa abordagem funciona. Você pode precisar adicionar isso ao UITableViewController para que a cor personalizada apareça no entanto ... - (void) tableView: (UITableView *) tableView willBeginEditingRowAtIndexPath: (NSIndexPath *) indexPath {[self.yourTableView reloadData]; } timothykc
1

Esta é a solução:

- (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];
        }
    }
}
Essa abordagem precisa ser modificada para o iOS 7. Veja minha resposta acima, assim comostackoverflow.com/a/22350817/1758337 timothykc
2

ativar o botão de exclusão no furto

// verifique se você tem os seguintes métodos no 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.");
}

defina o rótulo de texto personalizado em vez de excluir.

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

defina cor personalizada para o botão parte 1 - aviso, isso tecnicamente envolve cutucar a API da Apple privada. No entanto, você não está impedido de modificar uma subvisualização usando uma pesquisa de método público que faz parte do UIKIT.

Crie uma classe uitableviewcell (veja tambémhttps://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];
            }
        }
    }    
}

Outra observação: não há garantia de que essa abordagem funcionará em futuras atualizações. Tenha também cuidado ao mencionar ou usar a privacidadeUITableViewCellDeleteConfirmationView classe pode levar à rejeição da AppStore.

definir cor personalizada para a parte 2 do botão

de volta ao seu uitableviewcontroller

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

(A cor alternativa não será chamada até a próxima vez que layoutSubviews for chamado na tablecell, então garantimos que isso aconteça recarregando tudo.)

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];
    });
}

Então no UITableViewDelegate:

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

Isso funciona no iOS 7.1.2

Impressionante! funciona muito bem para mim. marmor
2

seis meses depois, o iOS 8 apareceu e não funciona mais direito.

Agora, você precisa procurar por uma subvisualização chamada "_UITableViewCellActionButton"e defina a cor de fundo disso.

Abaixo está uma versão modificada do código do silyevsk que eu usei no meu aplicativo.

Emalguns do meuUITableView células, eu não quero que o usuário seja capaz de deslizar para excluir, mas eufez quer que algo (um ícone de cadeado) apareça quando eles passarem.

Para fazer isso, adicionei umbReadOnly variável para minha classe UITableViewCell

@interface NoteTableViewCell : UITableViewCell

. . . 

@property (nonatomic) bool bReadOnly;

-(void)overrideConfirmationButtonColor;

@end

e adicionei o código do silevsk ao meu arquivo .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];
        }
    });
}

Além disso, eu precisava mudar o código que preenche oUITableViewcaso contrário, o rótulo "Excluir" aparecerá, assim como o ícone do cadeado:

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

Ainda é feio e se baseia em suposições de que isso não mudará quando o iOS 9 aparecer.

5

o é possível alterar facilmente sua aparência.

Para fazer isso, acredito que você teria que percorrer as subvisualizações da célula e alterar suas propriedades:

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

Claro, você deve ter cuidado em fazer esse tipo de coisa, já que é bastante frágil. Eu sugiro que você mude o seu próprio lugar.

Eu sugeririaenviando um relatório de bug para a Apple para solicitar a capacidade de editar isso mais facilmente.

Ah, finalmente encontrei a solução, agora colocaria o código) Anatoliy Gatt
Eu atualizaria o post agora, para que você possa ver o que eu fiz. Anatoliy Gatt
Mas eu não vejo nenhum resultado, mesmo quando eu tento adicionar subview como o botão, ele não faz isso, mas a UILabel se encaixa perfeitamente. Anatoliy Gatt

Perguntas relacionadas