UITableViewCell Separator desaparece en iOS7


129

Tengo un problema extraño UITableViewsolo con iOS 7.

UITableViewCellSeparatordesaparece por encima de la primera fila y debajo de la última fila. A veces, después de seleccionar las filas o algunas acciones de desplazamiento, aparece.

En mi caso tableViewse carga desde el Storyboardcon UITableViewStylePlainestilo. El problema seguramente no está en UITableViewCellSeparatorStyle, que no se cambia de forma predeterminada UITableViewCellSeparatorStyleSingleLine.

Como leí en los foros de desarrollo de Apple ( aquí y aquí ) otras personas tienen ese problema y se encuentran algunas soluciones, por ejemplo:

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

Pero todavía estoy buscando la razón de tal comportamiento extraño separador.

¿Algunas ideas?

Actualización: como vi en XCode 5.1 DP y iOS 7.1 beta, Apple intentó solucionar este problema. Ahora el separador se muestra según sea necesario a veces debajo de la última fila, después de un poco de actualización, pero no después de la creación de la vista de tabla.


19
A veces siento que iOS7 es tan inmaduro. Esto y la larga lista de cosas que tengo aquí muestran cuán lejos está iOS7 de la perfección de iOS anteriores.
Bms270

1
La aplicación de configuración de Apple tiene el mismo problema, así que creo que este es un problema de iOS 7. Lo informé, y en su seguimiento pidieron imágenes que mostraran el problema.
Johan

@Gatada ¿En qué parte de la aplicación Configuración está viendo el problema?
Jamie Forrest

2
Encontró el mismo problema y se solucionó agregando [cell setSeparatorInset: UIEdgeInsetsFromString (@ "1")]; con in (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) método indexPath
Ayesha Fatima

1
Esto todavía parece estar roto en las versiones beta de iOS 8.0. He abierto el radar 17724043 si alguien quiere duplicarlo.
Andy Wilkinson

Respuestas:


77

Descarté la jerarquía de subvista de las celdas afectadas y descubrí que _UITableViewCellSeparatorViewestaba configurada como oculta. ¡No es de extrañar que no se muestre!

Me anulé layoutSubviewsen mi UITableViewCellsubclase y ahora los separadores se muestran de manera confiable:

Objetivo-C :

- (void)layoutSubviews {
    [super layoutSubviews];

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

Rápido :

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
        }
    }
}

Las otras soluciones propuestas aquí no funcionaron de manera consistente para mí o parecen torpes (agregando vistas de pie de página personalizadas de 1 px).


He utilizado su método, pero no en la subclase. Agregué una categoría a UITableViewCell. Me ayudó. Gracias.
Vitalii Boiarskyi

Por supuesto, también es posible en una categoría. Dado que esto requiere un método swizzling, opté por el enfoque de subclase simple.
Ortwin Gentz

3
Esta es la única solución que funcionó para mí. Mi problema apareció cuando UITableView tenía suficientes filas para poder desplazarse. Sin embargo, esa parte de "hasSuffix:" es bastante frágil.
juhan_h

Funciona para mi. Tal vez la pregunta es tonta, pero ¿no es esto el uso de API privada?
Foriger

1
Funciona para mí en iOS9
tounaobun

42

Esto funcionó para mí:

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

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

Te mereces más votos, esto es exactamente lo que necesitaba, lo agregué en una categoría, así que ahora, después de hacerlo [tableView reloadData], si ocurre este error (en mi caso, el separador de pie de página que estaba oculto volverá a aparecer), llamo [tableView reloadSeparators];
NiñoScript

12

También tuve el problema con la falta de separador y descubrí que el problema sólo ocurrió cuando heightForRowAtIndexPathestaba volviendo un número decimal . Solución:

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

1
¿Qué pasa con el caso si no implemento incluso el método heightForRowAtIndexPath?
BS

Interesante. Sin embargo, también ocurre en mi proyecto, y heightForRowAtIndexPath no está implementado. En la fila IB, la altura de la celda es 100.
Johan

66
No me resolvió el problema y tengo el método heightForRowAtIndexPath.
Gergely Kovacs

Resuelve el problema al menos parcialmente. La celda parece estar confundida acerca de las alturas no enteras.
Nick Frolov

Debe limitar el número de píxeles y luego dividirlo por el factor de escala de la pantalla para obtener puntos, lo cual está bien en decimales. Si no haces esto, no se optimizará la retina.
trss

11

¿Intentó agregar una UIView de altura 1 en el encabezado y el pie de página de la tabla con un color de fondo gris claro? Básicamente se burlará del primer y último separador.


esto suena bien, pero ¿cómo exactamente haces esto? utilizar viewforfooter?
skinsfan00atg

1
no es tan fácil como parece, por alguna razón también tuve que implementar heightforfooter, de lo contrario la altura especificada en initwithframe fue ignorada. Sin embargo, también noto que el color gris claro no es del mismo color, por lo que esto realmente no funcionará. podría tener que hacer un gris personalizado
skinsfan00atg

eso es bastante janky IMO
JackyJohnson

Sí, estoy totalmente de acuerdo. Es la única solución que encontré justo después del lanzamiento de iOS 7, ¿hay algún enfoque mejor ahora?
airpaulg

2
Para hacer coincidir el color, use tableView.separatorColor
Jeff

8

@samvermette

Solucioné el problema usando estos métodos de delegado. Ahora no parpadea:

-(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 este problema en nuestra aplicación. Cuando el usuario seleccionó una celda, se introdujo una nueva vista de tabla en la pila del controlador de navegación y luego, cuando el usuario la abrió, faltaba el separador. Lo resolvimos poniendo [self.tableView deselectRowAtIndexPath:indexPath animated:NO];en el didSelectRowAtIndexPathmétodo delegado de vista de tabla.


¿Lo has intentado self.tableView.allowsMultipleSelection = NO;?
wrightak

6

Aquí hay una solución más fácil (aunque un poco desordenada) si la necesita, intente seleccionar y anular la selección de la celda después de que se vuelvan a cargar los datos y se complete la animación predeterminada.

solo agrega:

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

1
Esta solución me lo arregló; sin embargo, lo revirtí para retener la selección. Entonces, primero deseleccione, luego vuelva a seleccionar.
Johan

2
No sé qué anular cuando dices "después de volver a cargar los datos"
airpaulg

6

Descubrí que la solución más fácil es, después de volver a cargar una celda, también recargar la celda anterior:

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

1
Trabajó para mi. Gracias. Cualquier otro método no me ayudó (incluye el cambio de estilo del separador de la respuesta de samvermette).
surfrider

4

Una solución simple y limpia que funciona tanto en iOS 8 como en iOS 9 (beta 1)

Aquí hay una solución simple, limpia y no intrusiva. Implica llamar a un método de categoría que arreglará los separadores.

Todo lo que necesita hacer es caminar por la jerarquía de la celda y quitar el separador. Me gusta esto:

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

Lo que recomiendo es agregar esto a una categoría en UITableViewCell, así:

@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

Debido a que el separador puede desaparecer en una celda diferente a la seleccionada actualmente, probablemente sea una buena idea llamar a esta corrección en todas las celdas en la vista de tabla. Para eso, puede agregar una categoría a UITableView que sea así:

@implementation UITableView (fixSeparators)

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

@end

Con esto en su lugar, puede llamar -fixSeparatosa su TableView justo después de la acción que hace que desaparezcan. En mi caso, fue después de llamar [tableView beginUpdates]y [tableView endUpdates].

Como dije al principio, lo probé tanto en iOS 8 como en iOS 9. Supongo que funcionará incluso en iOS 7, pero no tengo forma de probarlo allí. Como probablemente ya sepa, esto sí juega con los componentes internos de la célula, por lo que podría dejar de funcionar en alguna versión futura. Y Apple podría teóricamente (0.001% de probabilidad) rechazar su aplicación debido a esto, pero no puedo ver cómo incluso podrían descubrir lo que está haciendo allí (los analizadores estáticos no pueden detectar el sufijo de una clase como algo mal, en mi opinión).


SI. Esto funcionó para mí, después de convertir a la última versión de Swift. ++ para llamar a fixSeparators después de cada llamada a tableView.endUpdates ().
ObjectiveTC

1
¡Me alegra que te haya sido útil! Realmente creo que esta es la mejor solución, así que espero que más personas la descubran.
Lukas Petr

4

Basado en el comentario de @ ortwin-gentz, esta solución funciona para mí en 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 la función fixCellsSeparator () después de llamar a endUpdates () en algunos métodos de mi tableView, por ejemplo:

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

    //  Perform some stuff
    //  ...

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

}

¡Espero que esta solución sea útil para alguien!


2

Complemento a la respuesta de airpaulg.

Básicamente, uno tiene que implementar dos métodos UITableDelegate. Aquí está mi solución que funciona tanto en iOS7 como en 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]

// Esto ocultará la cuadrícula de la tabla vacía debajo de las celdas si no cubren toda la pantalla

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

Esto solucionó el problema para mí:

Asegúrese de que clipsToBoundsesté establecido en SÍ para la celda, pero NO para la celda contentView. También establecercell.contentView.backgroundColor = [UIColor clearColor];


¡Establecer clipSubviews en falso en el guión gráfico tanto para la celda como para contentView solucionó el problema! ¡Necesita más votos!
Brett

Establecer clipsToBounds en SÍ en las celdas fue suficiente para mí.
Rene Juuse

2

Parece que este problema se manifiesta en muchas circunstancias.

Para mí tenía algo que ver con la selección celular. No tengo idea de por qué y no tuve tiempo de profundizar demasiado, pero puedo decir que comenzó a ocurrir cuando configuré las celdas selectionStyleen ninguno. es decir:

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

Intenté usar algunos de los métodos de delegado anteriores que activan y desactivan la separatorStyle propiedad del tableViewpero no parecen hacer nada para solucionar mi problema.

La razón por la que necesitaba eso era porque ni siquiera necesitaba la selección celular.

Entonces, encontré algo que funcionó para mí. Acabo de deshabilitar la selección en UITableView:

tableView.allowsSelection = NO;

Espero que esto ayude a alguien, si no necesita tener una selección celular.


2

Intenté muchas sugerencias para solucionarlo, pero no puedo solucionarlo. Finalmente decidí personalizar la línea de separación de la siguiente manera:

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 en willDisplayCell NO cellForRowAtIndexPath


1

Sorprendentemente, cambiar el separatorInsetvalor de la celda de un lado a otro 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

También tuve el problema de esta línea de separación inconsistente en la parte inferior de mi UITableView. Utilizando una vista de pie de página personalizada, he podido crear una línea similar y mostrarla encima de la posible existente (que a veces faltaba).

El único problema de esta solución es que Apple puede cambiar un día el grosor de la línea.

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

He resuelto poner estas líneas de código donde se realiza la actualización de la vista de tabla:

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

Por ejemplo, en mi caso los puse aquí:

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

1

Debe eliminar una selección de celda antes de realizar la actualización de la celda. Entonces podrías restaurar la selección.

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 solucionar el problema anterior, agregue un pie de página vacío en viewDidLoad.

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

No utilice las líneas anteriores en el método de delegado viewForFooterInSection. Significa No implementar el método viewForFooterInSection.


0

para ampliar la respuesta de airpaulg, porque no funcionó del todo para mí ...

También tuve que implementar el método heightforfooter para obtener la altura

entonces noté que el color gris claro es demasiado oscuro. Lo arreglé agarrando el color del separador actual de la vista de tabla y usando eso:

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


0

También me encontré con este problema en nuestro proyecto. Mi vista de tabla tenía un tableFooterView que podía hacer que esto sucediera. Encontré que el separador debajo de la última fila aparecería si eliminara esa tablaFooterView.


0

Lo que marcó la diferencia para mí fue volver a cargar la fila para la que no aparecería la línea de separación inferior:

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

0

Resuelvo este problema de otra manera: agrego una capa que tiene una altura de 0.5px y su color es gris claro en tableview.tableFooterView como su subcapa.

El código es así:

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

En su subclase UITableViewCell, implemente layoutSubviews y agregue:

- (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 alguien más mencionó, este problema parece manifestarse en una variedad de formas. Resolví mi problema a través de la siguiente solución:

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

0

Al revisar las respuestas y soluciones, se me ocurrieron tales observaciones:

Esto parece ser problemático tanto en iOS 7 como en 8. Noté el problema al seleccionar la celda del código en el viewDidLoadmétodo, por lo que:

1) la solución lo estaba haciendo viewDidAppear:si a alguien no le importa el retraso notable entre la presentación de la vista y la selección de la celda

2) la segunda solución funcionó para mí, pero el código parece un poco frágil ya que se basa en la implementación interna deUITableViewCell

3) agregar un separador propio parece ser el más flexible y mejor por ahora, pero requiere más codificación :)



0

Como esto sigue siendo un problema con iOS 8, agregaré mi solución en Swift. Establezca la línea de separación de tableview en none. Luego agregue este código al método de delegado cellForRowAtIndexPath. Agregará un buen separador. La instrucción if permite decidir qué celdas deben tener un 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

Aquí está mi solución a este problema. Después de insertar su (s) celda (s), vuelva a cargar la sección. Si la recarga de toda la sección es demasiado intensa para usted, simplemente vuelva a cargar los indexPaths arriba y abajo.

[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

encontré un problema similar, descubrí que otra buena solución, especialmente si su dataSource no es grande, es volver a cargar el tableData cuando implemente el -(void)scrollViewDidScroll:(UIScrollView *)scrollViewmétodo, aquí hay un ejemplo:

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

      else {
          [self.tableView2 reloadData];
      }
}

También puede volver a cargar datos no visibles basados ​​en la fuente de datos visible, pero eso requiere más pirateo.

¡Tenga en cuenta que esta función de delegado está incluida en el UITableViewDelegateprotocolo!

¡Espero eso ayude!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.