Por defecto hay una sola línea de separador en uitableview.

Pero quiero poner mi línea personalizada como un separador.

Es posible? Cómo?

12 Comentarios

  1. 82

    Si quieres hacer algo más que cambiar el color del separador utilizando el separatorColor propiedad de la UITableView entonces usted puede establecer la separatorStyle propiedad UITableViewCellSeparatorStyleNone y, a continuación, ya sea:

    • crear UITableViewCells que incluyen personalizado separador dentro de ellos
    • crear alternativos UITableViewCells que incluyen el separador personalizado

    Por ejemplo, si la tabla en la actualidad muestra 5 filas puede actualizar para la visualización de 9 filas y las filas en el índice 1, 3, 5, 7 separador de células.

    Ver Subclases UITableViewCell en el La Vista De La Tabla Guía De Programación para obtener más información sobre cómo crear UITableViewCells.

    • Gran gran NO a la utilización de células para los separadores. Que es simplemente feo, pero subclases UITableViewCell y primordial layoutSubviews es lo que me recomienda. stackoverflow.com/questions/12509747/…
    • El uso de células para los separadores es perfecta en algunos escenarios. De hecho, sólo queríamos un punto 3-amplia, transparente separador. Poner en invisible, el espaciador de las células era perfecto para eso!
  2. 35

    Una solución mejor es utilizar la celda de la anchura y la altura. Algo como esto:

    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)];
    
    lineView.backgroundColor = [UIColor darkGrayColor];
    [cell.contentView addSubview:lineView];
    • Si usted tiene un desplazamiento en formato tableview con un número mayor de células, esto se mantenga la adición de subvistas a medida que las células se reciclan cuando el usuario desplaza el formato tableview. No es una buena solución.
    • -1 para esta solución, porque estoy de acuerdo con el comentario anterior. Esta es una mala solución si usted tiene más de 10 o tan células (y va a reutilizar/sacarlo de la cola de ellos) porque el divisor utilizado en una celda, aparecerá cuando una célula se vuelve a utilizar y que no puede ser donde usted lo desee.
    • ¿cómo puede suceder si pones esas líneas en el inicio de su celda(o su contentView de inicio (init), de ahí agregar sólo una vez? Reciclado de células se consigue eliminando con este separador y lo único que tendrías que hacer es actualizar la célula contentView de datos.
    • aunque es bueno pensar en tales casos, no se refiere a este particular respuesta a esta pregunta, ya que el OP solo quiere usar algunas de las vistas personalizadas. Por otra parte, si usted usa limitaciones y el palo del separador de la parte inferior de la celda contentView, en mi humilde opinión, sería lo más esperado de comportamiento que se puede obtener con la costumbre de los separadores. Ahora, puede ser cierto si usted no utiliza ningún tipo de UITableViewCell subclase, pero si vas a sacarlo de la cola de un tipo específico de célula, el separador de la posición en la que se espera también. Por favor podría elaborar un poco más en los ejemplos?
  3. 31

    Si usted necesita diferentes separador de colores para las diferentes filas O desea el separador para permanecer visible cuando la fila se puso de relieve en pulse, a continuación, intente esto:

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    
    //We have to use the borderColor/Width as opposed to just setting the 
    //backgroundColor else the view becomes transparent and disappears during 
    //the cell's selected/highlighted animation
    UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 1024, 1)];
    separatorView.layer.borderColor = [UIColor redColor].CGColor;
    separatorView.layer.borderWidth = 1.0;
    [cell.contentView addSubview:separatorView];

    Esto supone que la celda del color de fondo es transparente.


    La solución vino de parte de una amplia experimentación. He aquí algunas notas sobre mis hallazgos que estoy seguro de que ayudará a la gente:

    En la normal «no seleccionado» estado

    • La contentView (whats en su XIB a menos que usted codificado de otra manera) se dibuja normalmente
    • La selectedBackgroundView se OCULTA
    • La backgroundView es visible (así lo disponga su contentView es transparente se puede ver el backgroundView o (si no se ha definido un backgroundView verás el color de fondo de la UITableView sí mismo)

    Se selecciona una celda, la siguiente se produce de inmediato sin ningún tipo de animación:

    • Todos los puntos de vista/subvistas dentro de la contentView tienen sus backgroundColor desactivada (o transparente), etiqueta, etc el color del texto a cambiar a su color seleccionado
    • La selectedBackgroundView se hace visible (este punto de vista es siempre el tamaño completo de la celda (un marco personalizado se omite, el uso de una subvista si usted necesita). También tenga en cuenta el fondo de subvistas no se muestran por alguna razón, quizás son transparentes como el contentView). Si usted no definir un selectedBackgroundView luego de Cacao va a crear o insertar el azul (o gris) gradiente de fondo y mostrar esto para usted)
    • La backgroundView es invariable

    Cuando la célula no está seleccionada, una animación para quitar el resaltado comienza:

    • La selectedBackgroundView propiedad alpha está animado de 1.0 (totalmente opaco) a 0.0 (completamente transparente).
    • La backgroundView es de nuevo sin cambios (por lo que la animación se ve como un fundido cruzado entre selectedBackgroundView y backgroundView)
    • Sólo una vez que la animación ha terminado hace el contentView llegar a dibujar en el «no seleccionado» estado y sus subvista backgroundColor ser visible de nuevo (esto puede causar que su animación a verse horrible por lo que es recomendable que no uses UIView.backgroundColor en su contentView)
  4. 13

    Estas respuestas resultado en el punto culminante rect ser sobrescrito por el separador que añadir a tu celular (en iOS 6 con mis pruebas, al menos). Usted necesita para establecer el separatorColor a [UIColor clearColor] de modo que las células están separadas por 1px, a continuación, puede dibujar el separador en la brecha:

    - (void)viewDidLoad {
        self.tableView.separatorColor = [UIColor clearColor];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        //snip
        CALayer *separator = [CALayer layer];
        separator.backgroundColor = [UIColor redColor].CGColor;
        separator.frame = CGRectMake(0, 43, self.view.frame.size.width, 1);
        [cell.layer addSublayer:separator];
        return cell;
    }
    • Esto crea una línea para la vista actual. Será demasiado corto cuando la pantalla gira en el paisaje. Para esto usted necesita para agregar restricciones.
    • También recomendaría llamar a super.viewDidLoad()
  5. 8

    Agregue el código siguiente cellForRowAtIndexPath delegado de formato tableview para crear una imagen personalizada de vista de 1px de altura y 200 píxeles de ancho por everyCell

    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];

    Nota: no sé cuánto pesará sobre el rendimiento.

    • No está seguro de cuánta diferencia hace, pero pongo esto en willDisplayCell delegado de formato tableview.
  6. 4

    No sé si esto se puede hacer «automáticamente» con algunos ajustes. Pero una sugerencia sería la de fijar el separador de línea como ninguno, y en los bordes de las células realmente llamar su separador de línea que desee..

  7. 3

    Si el uso Personalizado de Células en Swift: Un enfoque alternativo es extender UITableViewCell con una función que puede dibujar una línea en la parte superior de la celda.

    import UIKit
    
    extension UITableViewCell {
        func addSeparatorLineToTop(){
            let lineFrame = CGRectMake(0, 0, bounds.size.width, 1)
            let line = UIView(frame: lineFrame)
            line.backgroundColor = UIColor.myGray_300()
            addSubview(line)
        }
    }

    A continuación, puede añadir esta línea a cualquier celda personalizada, por ejemplo en el awakeFromNib

    override func awakeFromNib() {
        super.awakeFromNib()
        addSeparatorLineToTop()
    }

    Esta solución es agradable porque no estropear su guión y los límites de su código extra para 1 línea.

  8. 1

    En una pantalla de la retina, incluso un dibujo de un 0.5 unidad línea resultará en una de dos píxeles de la línea, debido a la anti-aliasing. Para que sea como un solo píxel en ambas pantallas, cambio de hasta un cuarto de unidad:

    UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentView.frame.size.height - (1.0 - 0.25), self.contentView.frame.size.wi
    lineView.backgroundColor = [UIColor colorWithRed:(230.0/255.0f) green:(233/255.0f) blue:(237.0/255.0f) alpha:1.0f];
    [self.contentView addSubview:lineView];
  9. 1

    Probado en iOS 7 (GM):

    @implementation MyTableViewController
    
    - (void)viewDidLayoutSubviews {
        for (UIView *view in self.view.subviews) {
            if ([view isKindOfClass:NSClassFromString(@"_UITableViewCellSeparatorView")])
                view.backgroundColor = [UIColor redColor];
        }
    }
    
    @end

    NOTA: parece que el UITableView mueve separadores para las células en algunas configuraciones, lo que haría que este código no funcionará a menos que descienden en todos los UITableViewCells así.

    • Yo creo que puede estar teniendo un problema similar a como llegué aquí buscando _UITableViewCellSeparatorView. Tengo un separador personalizado aplicación que funciona en iOS 6, pero en iOS 7 parece estar mostrando el separador por defecto, además de la mía. Configuración de separador de estilo para UITableViewCellSeparatorStyleNone hace desaparecer. Fueron capaz de ir más allá con su problema?
    • Es el uso de la API privada y puede resultar en rechazo de la aplicación así como puede brok en una futura versión de iOS.
    • No API privada. Pero se debe tener cuidado con él porque tienes razón en que es privado de la vista de jerarquía y puede cambiar en cualquier momento. Sin embargo, esto es meramente estética y es accidente seguro.
    • ES una API privada – aviso de un carácter de subrayado al principio de _UITableViewCellSeparatorView nombre de la clase que se esté usando. Por otra parte, usted incluso no tiene acceso a la declaración de la clase en un .h archivo. Puede ser fácilmente cambiado a, digamos, _UITableViewCellSeparatorView**2** en cualquier versión futura sin previo aviso y este enfoque no.
    • No es privado de la API, no estamos llamando a un método privado. Sin embargo, esta es el punto de vista del privado de la vista de jerarquía, y como usted dice que puede cambiar en cualquier momento. Yo siempre que este ejemplo porque a veces esta es la única opción. Usted tiene que decidir si desea que el riesgo de que la aplicación no tiene estilo separadores o no. Pero no hay ningún riesgo de rechazo porque no ejecutar cualquier API privada. Y no hay ningún riesgo de accidente con mi ejemplo.
  10. 1

    La celda en la esencia de abajo es un UITableViewCell la subclase donde cada celda puede tener su propio separador w/muchos estilos (actualmente sólo .Ninguno y .Por defecto son compatibles).
    Está escrito en Swift y asume el diseño Automático de uso.

    https://gist.github.com/evgeniyd/fa36b6f586a5850bca3f

    Cómo utilizar la clase:

    1. conjunto UITableView objeto del separador de estilo para UITableViewCellSeparatorStyle.None

      tableView.separatorStyle = .None
    2. Crear una subclase de MPSTableViewCell

    3. En algún lugar dentro de awakeFromNib() conjunto de células del separador de estilo

    Nota: el código siguiente se supone células se cargan de xib/storyboard

        class FASWorkoutCell: FASTableViewCell {
    
        required init(coder aDecoder: NSCoder) {
             super.init(coder: aDecoder)
         }
    
         override func awakeFromNib() {
             super.awakeFromNib()
    
             separatorType = .Default
         }
    
         //...
    
         }
  11. 0

    Si se utiliza de una manera personalizada, UITableViewCell, Usted puede simplemente añadir una UIView en la parte inferior de la UItableViewCell.xib y poner el color de fondo como el color que usted desee.

    Por ejemplo, en xib puedo añadir un UIView en la parte inferior y el conjunto de la altura 1. El uso de autodiseño, yo a la izquierda restricción a 12 de la parte inferior de la restricción a 0, derecha restricción a 0 y la altura a 1.

  12. 0

    Swift versión:

    private let kSeparatorTag = 123
    private let kSeparatorHeight: CGFloat = 1.5
    
    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
    {
        if cell.viewWithTag(kSeparatorTag) == nil //add separator only once
        {
            let separatorView = UIView(frame: CGRectMake(0, cell.frame.height - kSeparatorHeight, cell.frame.width, kSeparatorHeight))
            separatorView.tag = kSeparatorId
            separatorView.backgroundColor = UIColor.redColor()
            separatorView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    
            cell.addSubview(separatorView)
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here