Separador UITableViewCell desaparecendo no iOS7


129

Eu tenho algum problema estranho UITableViewapenas no iOS 7.

UITableViewCellSeparatordesaparece acima da primeira linha e abaixo da última linha. Às vezes, depois de selecionar as linhas ou algumas ações de rolagem, ela aparece.

No meu caso tableViewé carregado do Storyboardcom UITableViewStylePlainestilo. O problema certamente não está presente UITableViewCellSeparatorStyle, o que não é alterado do padrão UITableViewCellSeparatorStyleSingleLine.

Como li nos Fóruns de desenvolvimento da Apple ( aqui e aqui ), outras pessoas têm esse problema e algumas soluções alternativas são encontradas, por exemplo:

Workaround: disable the default selection and recreate the behaviour in a method
trigged by a tapGestureRecognizer.

Mas ainda estou procurando a razão de um comportamento estranho desse separador.

Alguma ideia?

Atualização: Como eu vi no XCode 5.1 DP e no iOS 7.1 beta, a Apple tentou corrigir esse problema. Agora, o separador é mostrado conforme necessário algumas vezes abaixo da última linha, após alguma atualização, mas não após a criação da visualização da tabela.


19
Às vezes, sinto que o iOS7 é tão imaturo. Esta e a longa lista de coisas que tenho aqui mostram a que distância o iOS7 está da perfeição dos iOSs anteriores.
precisa saber é o seguinte

1
O aplicativo Configurações da Apple tem o mesmo problema, por isso acredito que seja um problema do iOS 7. Eu relatei e, na sequência, eles pediram imagens mostrando o problema.
31413 Johan Johan

@Gatada Onde você está vendo o problema no aplicativo Configurações?
Jamie Forrest

2
Foi encontrado o mesmo problema e corrigido adicionando [cell setSeparatorInset: UIEdgeInsetsFromString (@ "1")]; com em (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) método indexPath
Ayesha Fatima

1
Isso ainda parece estar quebrado nas versões beta do iOS 8.0. Abri o radar 17724043, se alguém quiser enganá-lo.
Andy Wilkinson

Respostas:


77

Despejei a hierarquia de subvisão das células afetadas e constatei que ela _UITableViewCellSeparatorViewestava oculta. Não é de admirar que não seja mostrado!

Substituí layoutSubviewsminha UITableViewCellsubclasse e agora os separadores são exibidos de forma confiável:

Objetivo-C :

- (void)layoutSubviews {
    [super layoutSubviews];

    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

Swift :

override func layoutSubviews() {
    super.layoutSubviews()

    guard let superview = contentView.superview else {
        return
    }
    for subview in superview.subviews {
        if String(subview.dynamicType).hasSuffix("SeparatorView") {
            subview.hidden = false
        }
    }
}

As outras soluções propostas aqui não funcionaram consistentemente para mim ou parecem desajeitadas (adicionando visualizações personalizadas de rodapé de 1 px).


Eu usei seu método, mas não na subclasse, eu adicionei uma categoria ao UITableViewCell. Isso me ajudou. Obrigado.
Vitalii Boiarskyi

Claro que também é possível em uma categoria. Como isso requer um método swizzling, fui para a abordagem simples de subclasse.
Ortwin Gentz

3
Esta é a única solução que funcionou para mim. Meu problema apareceu quando o UITableView tinha linhas suficientes para rolagem. Essa parte "hasSuffix:" é bastante frágil.
21714 Juh_h

Funciona para mim. Talvez a pergunta seja boba, mas não é esse o uso da API privada?
#

1
Funciona para mim no iOS9
tounaobun 11/11/15

42

Isso funcionou para mim:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // fix for separators bug in iOS 7
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

Você merece mais votos, isso é exatamente o que eu precisava, eu o adicionei em uma categoria, então agora depois de fazer [tableView reloadData], se esse bug acontecer (no meu caso, o separador de rodapé que estava oculto está reaparecendo), eu chamo [tableView reloadSeparators];
NiñoScript

12

Eu também tive o problema com o separador ausente e descobri que o problema só ocorria quando heightForRowAtIndexPathestava retornando um número decimal . Solução:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return ceil(yourHeight) // Ceiling this value fixes disappearing separators
}

1
E o caso, se eu não implementar nem o método heightForRowAtIndexPath?
BS

Interessante. No entanto, isso também acontece no meu projeto - e heightForRowAtIndexPath não está implementado. Na altura da linha IB / célula é 100.
Johan

6
Ele não resolveu o problema para mim e eu tenho o método heightForRowAtIndexPath.
Gergely Kovacs

Resolve o problema pelo menos parcialmente. A célula parece estar confusa sobre alturas não inteiras.
Nick Frolov

Você precisa limitar o número de pixels e depois dividir pelo fator de escala da tela para obter pontos, o que significa que é decimal. Se você não fizer isso, a retina não será otimizada.
TRSs

11

Você tentou adicionar uma UIView de altura 1 no cabeçalho e no rodapé da tabela com a cor de fundo cinza claro? Basicamente, ele zombará do primeiro e do último separador.


isso parece bom, mas como exatamente você faz isso? usar viewforfooter?
skinsfan00atg

1
não é tão fácil quanto parece, por algum motivo eu também precisei implementar o heightforfooter, caso contrário a altura especificada no initwithframe foi ignorada. Percebo também que a cor cinza claro não é a mesma cor, então isso realmente não funciona. pode ter que fazer um cinza personalizado
skinsfan00atg 26/11

Isso é muito janky IMO
JackyJohnson

Sim, eu concordo plenamente. É a única solução alternativa que encontrei logo após o lançamento do iOS 7. Existe alguma abordagem melhor agora?
precisa saber é o seguinte

2
Para corresponder à cor, use tableView.separatorColor
Jeff

8

@samvermette

Corrigi o problema usando esses métodos de delegação. Agora não pisca:

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}


-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    // fix for separators bug in iOS 7
    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
}

7

Encontramos esse problema em nosso aplicativo. Quando o usuário selecionou uma célula, uma nova visualização de tabela foi colocada na pilha do controlador de navegação e, quando o usuário a abriu, o separador estava ausente. Resolvemos isso colocando [self.tableView deselectRowAtIndexPath:indexPath animated:NO];no didSelectRowAtIndexPathmétodo delegado de exibição de tabela.


Você já tentou self.tableView.allowsMultipleSelection = NO;?
wrightak

6

Aqui está uma solução mais fácil (embora um pouco bagunçada), se você precisar de uma, tente selecionar e desmarcar a célula depois que os dados forem recarregados e a animação padrão estiver concluída.

basta adicionar:

[self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
[self.tableView deselectRowAtIndexPath:indexPath animated:NO];

1
Esta solução alternativa o corrigiu para mim; no entanto, eu o invertei - para manter a seleção. Portanto, primeiro desmarque e selecione novamente.
Johan

2
Eu não sei o que para substituir quando você diz "após os dados são recarregados"
airpaulg

6

Descobri que a solução mais fácil é, após recarregar uma célula, também recarregar a célula acima:

if (indexPath.row > 0) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section];
    [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationNone];
}

1
Trabalhou para mim. Obrigado. Quaisquer outros métodos não me ajudaram (inclua a mudança no estilo do separador da resposta de samvermette).
surfrider

4

Uma solução simples e limpa que funciona no iOS 8 e iOS 9 (beta 1)

Aqui está uma solução simples, limpa e não intrusiva. Envolve chamar um método de categoria que irá corrigir os separadores.

Tudo o que você precisa fazer é percorrer a hierarquia da célula e ocultar o separador. Como isso:

for (UIView *subview in cell.contentView.superview.subviews) {
    if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
        subview.hidden = NO;
    }
}

O que eu recomendo é adicionar isso a uma categoria no UITableViewCell, assim:

@interface UITableViewCell (fixSeparator)
- (void)fixSeparator;
@end

@implementation UITableViewCell (fixSeparator)

- (void)fixSeparator {
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            subview.hidden = NO;
        }
    }
}

@end

Como o separador pode desaparecer em uma célula diferente daquela selecionada atualmente, provavelmente é uma boa ideia chamar essa correção em todas as células na exibição de tabela. Para isso, você pode adicionar ao UITableView uma categoria semelhante a esta:

@implementation UITableView (fixSeparators)

- (void)fixSeparators {
    for (UITableViewCell *cell in self.visibleCells) {
        [cell fixSeparator];
    }
}

@end

Com isso, você pode ligar -fixSeparatos seu tableView logo após a ação que os faz desaparecer. No meu caso, foi depois de ligar [tableView beginUpdates]e [tableView endUpdates].

Como afirmei no início, testei isso no iOS 8 e no iOS 9. Suponho que funcionará mesmo no iOS 7, mas não tenho como testá-lo lá. Como você provavelmente sabe, isso mexe com as partes internas da célula, para que possa parar de funcionar em algum release futuro. E a Apple poderia teoricamente (0,001% de chance) rejeitar seu aplicativo por causa disso, mas não consigo ver como eles conseguiram descobrir o que você está fazendo lá (verificar o sufixo de uma classe não pode ser detectado pelos analisadores estáticos como algo ruim, IMO).


SIM. Isso funcionou para mim, depois de converter para a versão mais recente do Swift. ++ para chamar fixSeparators após cada chamada para tableView.endUpdates ().
ObjectiveTC

1
Fico feliz que isso tenha sido útil para você! Eu realmente acredito que esta é a melhor solução, por isso espero que mais pessoas a descubram.
Lukas Petr

4

Com base no comentário de @ ortwin-gentz, esta solução funciona para mim no iOS 9.

func fixCellsSeparator() {

    // Loop through every cell in the tableview
    for cell: UITableViewCell in self.tableView.visibleCells {

        // Loop through every subview in the cell which its class is kind of SeparatorView
        for subview: UIView in (cell.contentView.superview?.subviews)!
            where NSStringFromClass(subview.classForCoder).hasSuffix("SeparatorView") {
                subview.hidden = false
        }
    }

}

(Código Swift)

Uso a função fixCellsSeparator () após chamar endUpdates () em alguns métodos do meu tableView, por exemplo:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    //  Perform some stuff
    //  ...

    self.tableView.endUpdates()
    self.fixCellsSeparator()

}

Espero que esta solução seja útil para alguém!


2

Complemento à resposta de airpaulg.

Então, basicamente, é preciso implementar dois métodos UITableDelegate. Aqui está a minha solução que funciona no iOS7 e iOS6.

#define IS_OS_VERSION_7 (NSFoundationVersionNumber_iOS_6_1 < floor(NSFoundationVersionNumber))

#define UIColorFromRGB(hexRGBValue) [UIColor colorWithRed:((float)((hexRGBValue & 0xFF0000) >> 16))/255.0 green:((float)((hexRGBValue & 0xFF00) >> 8))/255.0 blue:((float)(hexRGBValue & 0xFF))/255.0 alpha:1.0]

// Isso ocultará a grade da tabela vazia abaixo das células se elas não cobrirem a tela inteira

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    UIView *view = nil;

    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        CGFloat height = 1 / [UIScreen mainScreen].scale;
        view = [[UIView alloc] initWithFrame:CGRectMake(0., 0., 320., height)];
        view.backgroundColor = UIColorFromRGB(0xC8C7CC);
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    }
    else
    {
        view = [UIView new];
    }
    return view;
}


- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    if (IS_OS_VERSION_7 /* && <is this the last section of the data source> */)
    {
        return 1 / [UIScreen mainScreen].scale;
    }
    else
    {
        // This will hide the empty table grid below the cells if they do not cover the entire screen
        return 0.01f;
    }
}

2

Isso corrigiu o problema para mim:

Verifique se clipsToBoundsestá definido como SIM para a célula, mas NÃO para a célula contentView. Definir tambémcell.contentView.backgroundColor = [UIColor clearColor];


Definir clipSubviews como false no storyboard para a célula e o contentView corrigiu o problema! Precisa de mais votos!
21816 Brett

Definir clipsToBounds como YES nas células foi suficiente para mim.
Rene Juuse

2

Parece que esse problema se manifesta em tantas circunstâncias.

Para mim, tinha algo a ver com a seleção de células. Não tenho idéia do porquê e não tive tempo de investigar muito fundo, mas posso dizer que começou a ocorrer quando defini a célula selectionStylecomo nenhuma. ou seja:

//This line brought up the issue for me
cell.selectionStyle = UITableViewCellSelectionStyleNone;

Tentei usar alguns dos métodos de delegação acima que ativam e desativam a separatorStyle propriedade do, tableViewmas eles não parecem ter feito nada para corrigir o meu problema.

Todo o motivo pelo qual eu precisava disso era porque nem precisava da seleção de células.

Então, encontrei algo que funcionou para mim. Acabei de desativar a seleção no UITableView:

tableView.allowsSelection = NO;

Espero que isso ajude alguém, se você não precisa ter seleção de células.


2

Eu tentei tantas sugestões para corrigir, mas não posso consertar isso.Finalmente, decidi personalizar a linha separadora como abaixo:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    var lineView = UIView(frame: CGRectMake(20, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width - 20, 1))

    lineView.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1)
    cell.contentView.addSubview(lineView)
}

P / S: personalizado à vontadeDisplayCell NOT cellForRowAtIndexPath


1

Surpreendentemente, mudar o separatorInsetvalor da célula para frente e para trás parece estar funcionando:

NSIndexPath *selectedPath = [self.controller.tableView indexPathForSelectedRow];
[self.controller.tableView deselectRowAtIndexPath:selectedPath animated:YES];

UITableViewCell *cell = [self.controller.tableView cellForRowAtIndexPath:selectedPath];
UIEdgeInsets insets = cell.separatorInset;
cell.separatorInset = UIEdgeInsetsMake(0.0, insets.left + 1.0, 0.0, 0.0);
cell.separatorInset = insets;

1

Eu também tive o problema dessa exibição inconsistente da linha separadora na parte inferior do meu UITableView. Usando uma visualização de rodapé personalizada, consegui criar uma linha semelhante e exibi-la em cima da potencial existente (que às vezes estava faltando).

O único problema desta solução é que a Apple pode alterar um dia a espessura da linha

- (UIView*) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    float w = tableView.frame.size.width;

    UIView * footerView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, w, 1)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    footerView.clipsToBounds=NO;

    UIView* separatoraddon = [[UIView alloc] initWithFrame:CGRectMake(0, -.5, w, .5)];
    separatoraddon.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    separatoraddon.backgroundColor = tableView.separatorColor;
    [footerView addSubview:separatoraddon];

    return footerView;
}
- (CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 1;
}

1

Resolvi colocar essas linhas de código onde a atualização da tableview acontece:

self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

Por exemplo, no meu caso, eu os coloquei aqui:

tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(insertIndexPaths, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None;
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine;

1

Você precisa remover uma seleção de célula antes de fazer a atualização da célula. Então você pode restaurar a seleção.

NSIndexPath *selectedPath = [self.tableview indexPathForSelectedRow];
    [self.tableview deselectRowAtIndexPath:selectedPath animated:NO];
    [self.tableview reloadRowsAtIndexPaths:@[ path ] withRowAnimation:UITableViewRowAnimationNone];
    [self.tableview selectRowAtIndexPath:selectedPath animated:NO scrollPosition:UITableViewScrollPositionNone];

1

Para corrigir o problema acima, adicione rodapé vazio no viewDidLoad.

UIView *emptyView_ = [[UIView alloc] initWithFrame:CGRectZero];   
emptyView_.backgroundColor = [UIColor clearColor];  
[tableView setTableFooterView:emptyView_];

Por favor, não use as linhas acima no método delegado viewForFooterInSection. Significa Não implementar o método viewForFooterInSection.


0

para expandir a resposta airpaulg, porque não funcionou inteiramente para mim ..

eu também tive que implementar o método heightforfooter para obter a altura

então notei que a cor cinza claro está muito escura. Eu consertei isso pegando a cor atual do separador da tableview e usando o seguinte:

UIColor *separatorGray = [self.briefcaseTableView separatorColor]; [footerSeparator setBackgroundColor:separatorGray];


0

Eu também encontrei esse problema em nosso projeto. Minha exibição de tabela tinha um tableFooterView que poderia fazer isso acontecer. Eu encontrei o separador abaixo da última linha apareceria se eu removesse o tableFooterView.


0

O que fez a diferença para mim foi recarregar a linha para a qual a linha separadora inferior não apareceria:

NSIndexPath *indexPath = 
     [NSIndexPath indexPathForRow:rowIndex inSection:sectionIndex];  
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

0

Resolvo esse problema de outra maneira: adicione uma camada com altura de 0,5px e cor cinza-clara em tableview.tableFooterView como subcamada.

o código é assim:

UIView *tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 70)];
CALayer *topSeperatorLine = [CALayer layer];
topSeperatorLine.borderWidth = 0.5f;
topSeperatorLine.borderColor = [UIColor lightGrayColor].CGColor;
topSeperatorLine.frame = CGRectMake(0, 0, 320, 0.5f);
[tableFooterView.layer addSublayer:topSeperatorLine];
self.tableView.tableFooterView = tableFooterView;

0

Na subclasse UITableViewCell, implemente layoutSubviews e adicione:

- (void)layoutSubviews{
    [super layoutSubviews]
    for (UIView *subview in self.contentView.superview.subviews) {
        if ([NSStringFromClass(subview.class) hasSuffix:@"SeparatorView"]) {
            CGRect separatorFrame = subview.frame;
            separatorFrame.size.width = self.frame.size.width;
            subview.frame = separatorFrame;
        }
    }
}

0

Como outra pessoa mencionou, esse problema parece se manifestar de várias maneiras. Resolvi meu problema usando a seguinte solução alternativa:

[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];

0

Analisando as respostas e soluções, fiz essas observações:

Isso parece ser problemático no iOS 7 e 8. Notei o problema ao selecionar a célula do código no viewDidLoad método assim:

1) a solução alternativa estava sendo feita viewDidAppear:se alguém não se importasse com o atraso perceptível entre apresentar a exibição e selecionar a célula

2) a segunda solução funcionou para mim, mas o código parece um pouco frágil, pois se baseia na implementação interna doUITableViewCell

3) adicionar o próprio separador parece ser o mais flexível e o melhor por enquanto, mas exige mais codificação :)



0

Como esse ainda é um problema no IOS 8, adicionarei minha solução no Swift. Defina a linha separadora da tableview como nenhuma. Em seguida, adicione esse código ao método delegado cellForRowAtIndexPath. Ele adicionará um bom separador. A instrução if permite decidir quais células devem ter um separador.

    var separator:UIView!
    if let s = cell.viewWithTag(1000)
    {
        separator = s
    }
    else
    {
        separator = UIView()
        separator.tag = 1000
        separator.setTranslatesAutoresizingMaskIntoConstraints(false)
        cell.addSubview(separator)

        // Swiper constraints
        var leadingConstraint = NSLayoutConstraint(item: separator, attribute: .Leading, relatedBy: .Equal, toItem: cell, attribute: .Leading, multiplier: 1, constant: 15)
        var heightConstraint = NSLayoutConstraint(item: separator, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0.5)
        var bottomConstraint = NSLayoutConstraint(item: cell, attribute: .Bottom, relatedBy: .Equal, toItem: separator, attribute: .Bottom, multiplier: 1, constant:0)
        var trailingConstraint = NSLayoutConstraint(item: cell, attribute: .Trailing, relatedBy: .Equal, toItem: separator, attribute: .Trailing, multiplier: 1, constant: 15)
        cell.addConstraints([bottomConstraint, leadingConstraint, heightConstraint, trailingConstraint])
    }

    if indexPath.row == 3
    {
        separator.backgroundColor = UIColor.clearColor()
    }
    else
    {
        separator.backgroundColor = UIColor.blackColor()
    }

0

Aqui está a minha solução para este problema. Depois de inserir seu (s) celular (s), recarregue a seção. Se recarregar a seção inteira for muito intenso para você, basta recarregar os indexPaths acima e abaixo.

[CATransaction begin];
[CATransaction setCompletionBlock:^{
    //  Fix for issue where seperators disappear

    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];
}];

[self.tableView insertRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationFade];

[CATransaction commit];

0

encontrou um problema semelhante, descobri que outra boa solução, especialmente se o dataSource não for grande, recarrega o tableData quando você implementa o -(void)scrollViewDidScroll:(UIScrollView *)scrollViewmétodo, aqui está um exemplo:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
      if (scrollView == self.tableView1) {
          [self.tableView1 reloadData];
      }

      else {
          [self.tableView2 reloadData];
      }
}

Você também pode recarregar dados não visíveis com base na fonte de dados visível, mas isso requer mais hackers.

Lembre-se de que esta função delegada se enquadra no UITableViewDelegateprotocolo!

Espero que ajude!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.