Tengo un agrupados UITableview que se crea a través de programación. También tengo un celular con xib archivo poblada en formato tableview mediante programación. Hasta ahora tan bueno. Pero quiero quitar sólo exterior de la línea de separación. He utilizado a continuación el código, pero esta vez eliminada toda la línea de separación.

auto.formato tableview.separatorColor = [UIColor clearColor];

esta no es una buena opción para mi situación. Aquí está la captura de pantalla de lo que quiero hacer;

Agrupados UITableview quitar exterior de la línea de separación

  • Opción uno: Eliminar todos los separadores y agregar UIViews en la celda como falso separadores. Esperemos que haya una opción mejor.
  • Es el mismo enfoque que el de arriba. Como he dicho antes yo sólo quitar exterior significa la parte superior y la parte inferior de la línea de no línea interna. Si puedo eliminar todo el separador en formato tableview y añadir una nueva línea en la celda personalizada en formato tableview apariencia del mismo.
  • La solución es, utilizar formato tableview como Plain tableview, no se Agrupan. En Agrupados pone separadores en los encabezados y pies de página.
  • la solución funciona, muchas gracias :), claro, pero en formato tableview todavía muestra separador incluso si no tiene nada.
  • jaja acabo de encontrar la solución para dejar de mostrar el separador de líneas de llanura en formato tableview. stackoverflow.com/a/10771747
  • Es que tu serias, @iphonic?! Que debería ayudar? li2? Cuando alguien utiliza un agrupados en formato tableview más probable es que hay una buena razón para ello. ¿Has visto alguna vez que los separadores no son la única diferencia entre agrupados y la llanura formato tableview?
  • es correcto! Una mejor opción sería el uso de personalizado UITableviewcell.

InformationsquelleAutor serhat sezer | 2015-03-12

15 Comentarios

  1. 9

    Yo sólo funcionó una solución, ya que la celda ha contentView que es un UIView, así que yo creo que puede enfocarse sólo en la línea de fondo de contentView.

    Aquí está mi código:

    primer lugar, usted tiene que hacer el separador de claras

    tableView.separatorColor = UIColor.clear

    Segundo, en el cellForRowAt función:

    let bottomBorder = CALayer()
    
    bottomBorder.frame = CGRect(x: 0.0, y: 43.0, width: cell.contentView.frame.size.width, height: 1.0)
    bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).cgColor
    cell.contentView.layer.addSublayer(bottomBorder)

    aquí podrás ver la interfaz de usuario como este:

    Agrupados UITableview quitar exterior de la línea de separación

  2. 17

    Aquí está mi solución:

    self.tableView.separatorColor = self.tableView.backgroundColor

    Agrupados UITableview quitar exterior de la línea de separación

    • Elimina todos los separadores
    • Se la va a quitar todos separador. Si usted lee mi pregunta me dijo que solo me quería quitar el «exterior» de las líneas.
    • Sí he leído tu pregunta, este es un truco de la solución, se hace exterior de las líneas de «desaparecer» y mantener separador de líneas visibles.
  3. 12

    Puede quitar los separadores incluso en agrupados UITableView con Células Estática:

    class CustomCell: UITableViewCell {
    
    override func layoutSubviews() {
        super.layoutSubviews()
        for view in subviews where view != contentView {
            view.removeFromSuperview()
        }
    }
    • Todavía funciona muy bien en iOS 12, gracias.
    • exactamente lo que estaba buscando ! thx
  4. 9

    De Google, incluso en el 2018, es el que sirve a esta página en el primer resultado de esta pregunta. No tengo suerte en iOS 11 con cualquiera de las respuestas proporcionadas, así que aquí está lo que se me ocurrió:

    extension UITableViewCell {
        func removeSectionSeparators() {
            for subview in subviews {
                if subview != contentView && subview.frame.width == frame.width {
                    subview.removeFromSuperview()
                }
            }
        }
    }

    De llamadas .removeSectionSeparators() en cualquier UITableViewCell instancia de ahora va a tomar el cuidado del problema. En mi caso al menos, la sección de los separadores son los únicos con el mismo ancho que la propia célula (como los otros son sangría).

    La única pregunta que queda es desde donde se debe llamar. Se podría pensar willDisplayCell sería la mejor opción, pero he descubierto que la llamada inicial se produce antes de que el separador de puntos de vista propios que se generan, por lo que no dados.

    Me terminó de poner esto en mi cellForRowAtIndexPath método justo antes de devolver una recarga celular:

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyReusableIdentifier", for: indexPath)
    
        Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
            cell.removeSectionSeparators()
        }
    
        return cell
    }

    No se siente que elegante, pero no he corrido en ninguna de las cuestiones todavía.

    EDICIÓN: Parece necesitamos esta demasiado (para reutilizar las células):

    override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cell.removeSectionSeparators()
    }

    Aquí un antes y un después en las capturas de pantalla con este código:

    Antes de
    Agrupados UITableview quitar exterior de la línea de separación

    Después de
    Agrupados UITableview quitar exterior de la línea de separación

  5. 9

    Después de inspeccionar la vista de jerarquía, parece cada UITableViewCell tiene sólo tres subvistas: la vista del contenido (UITableViewCellContentView), y dos separador de vistas (_UITableViewCellSeparatorView). Yo no soy un fan de la dinámica de creación de instancias de clase de NSStrings (y tampoco es que Apple 😉). Sin embargo, debido a la contentView de un UITableViewCell es accesible sin el uso privado de la Api, la solución resulta ser bastante fácil.

    La idea es sólo para iterar a través de las subvistas de su UITableViewCell, y eliminar cualquier punto de vista que no son los contentView:

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        let subviews = cell.subviews
        if subviews.count >= 3 {
            for subview in subviews {
                if subview != cell.contentView {
                    subview.removeFromSuperview()
                    break
                }
            }
        }
    }

    tableView(:willDisplayCell:forRowAtIndexPath:) se llama varias veces durante la vista de la tabla de representación, por lo que la anterior sigue la pista de estado comprobando cómo muchos subvistas la celda. Si tiene tres subvistas, tanto los separadores están todavía intactas. Asimismo, sólo se elimina uno de los separadores, pero se puede eliminar tanto por la eliminación de la break. También puede especificar si se va a quitar la parte superior del separador o la parte inferior del separador, mediante la comprobación de la subvista del marco. Si el marco del eje y origen es 0, que es la parte superior del separador. Si no 0, es la parte inferior.

    Espero que esto ayude!

    Swift 4, Swift 4.2 Actualización:

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let subviews = cell.subviews
        guard subviews.count >= 3 else {
            return
        }
    
        for subview in subviews where NSStringFromClass(subview.classForCoder) == "_UITableViewCellSeparatorView" {
            subview.removeFromSuperview()
        }
    }
    • Gracias pero este enfoque puede ser problema con las futuras versiones de iOS?
    • Probablemente no, a menos que Apple cambia la estructura interna de tableviews tener el contenido de multiples puntos de vista. Si quieres ser aún más cuidadoso, usted podría utilizar como alternativa NSStringFromClass y comparar los valores en contra de la "_UITableViewCellSeparatorView" y "UITableViewCellContentView" y, a continuación, eliminar.
    • Apple hizo cambiar el tableViewCell vista de la jerarquía de iOS 7 a iOS 8, lo que realmente me quemó en un proyecto debido a que utiliza un código como este, por lo que recomiendo no hacerlo de esa manera.
    • Si usted está preocupado acerca de la obsolescencia o cambios internos, me gustaría recomendar el uso de la #available atributo con un cuerpo vacío para cualquier versión de iOS mayor que el de la versión actual.
  6. 4

    Que en realidad es una vieja pregunta, aún así es una de las primeras entradas en google cuando se busca cómo quitar la parte superior y la parte inferior separadores para cada sección.

    Después de investigar un poco, me enteré de que no hay manera y no sólo la intención de Apple para hacer esto de alguna manera se suceden sin estúpidamente complicado hacks de la vista de jerarquía.

    Afortunadamente, no es absolutamente simple y fácil manera de lograr este tipo de look:

    Agrupados UITableview quitar exterior de la línea de separación

    Digo simple, pero para un principiante, esto puede ser difícil debido a la falta de comprensión de cómo UITableView funciona y cómo implementar sus propias células. Permítanme tratar de explicarlo:

    1. Crear un UITableViewCell subclase
    2. En su celda, crear un @IBOutlet weak var separatorView: UIView! propiedad
    3. En su Guión gráfico, seleccione el formato tableview celda y seleccione su propia celda como la clase que realiza la célula. Nota: Usted no tiene que utilizar el estilo custom. Usted todavía puede utilizar Básica, Subtítulos, etc.
    4. Conjunto de su UITableViews Separator Style a None para ocultar el separador por defecto
    5. Arrastre un UIView en su celular y cambiar su tamaño por lo que está en la parte inferior (o superior) de la célula. El uso de la Size Inspectors Autoresizing anclar a inicio/final/parte inferior y darle un flex ancho (o Autodiseño pero eso es más de la parte superior en este caso)
    6. Conectar la vista a la salida de su clase de células
    7. En su UITableViewDataSources cellForRowAtIndexPath: conjunto de la isHidden propiedad de su separador personalizado basado en si el indexPath.row es el último de la fila (o el primero, si su visión está en la parte superior) en la sección

    Aquí está el código de ejemplo:

    class MyCell: UITableViewCell {
        @IBOutlet weak var separatorView: UIView!
    }
    
    class ViewController: UITableViewController {
    
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 3
        }
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 3
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCell
            cell.separatorView.isHidden = indexPath.row == 2
            return cell
        }
    
    }

    Y aquí algunas capturas de pantalla:

    Agrupados UITableview quitar exterior de la línea de separación

    Agrupados UITableview quitar exterior de la línea de separación

    Agrupados UITableview quitar exterior de la línea de separación

    Agrupados UITableview quitar exterior de la línea de separación

    Sí, es algo de trabajo, pero no hay manera de que algo gratis cuando la codificación. Al final, somos programadores y nos toca a nosotros hacer la codificación. Siempre es mejor pasar el 5-10 minutos de la configuración que acaba de copiar pegar algunas hacky código que no podría seguir trabajando en el futuro, cuando Apple decide cambiar la vista de jerarquía.

    Era en realidad más trabajo para escribir esta respuesta de la aplicación del separador. Yo también estaba buscando una fácil y rápida solución, pero al final no sólo no era lo suficientemente bueno uno que me pareció que era digno de usar.

    Espero que usted también se siente escéptico cuando vea para bucles de iterar sobre subvistas de las células para ocultar o incluso eliminar puntos de vista en tiempo de ejecución desde el punto de vista de la jerarquía de Apple ofrece a usted, cuando no es fácil, versátil, estable y a prueba de futuro de la solución a la vuelta de la esquina. 7 pasos pequeños es realmente todo lo que necesita y que son fáciles de entender.

    • ¿Su solución de trabajo con el accesorio de vista o estándar UITableViewCell accesorios (galones, botones de información, etc.)?
    • Ya que se puede utilizar estilos por defecto y no están obligadas a utilizar estilos personalizados, creo que debería funcionar sin problemas para utilizar el valor predeterminado accesorios.
    • Lo he probado y no podía hacer el separador a aparecer debajo de chevron en el interface builder. No trate de en dispositivo. La razón para ello – xcode permite añadir vistas a la celda del contentView. Chevron es una parte de accesorio de vista, el que se muestra al lado de contentView.
    • En ese caso, usted tiene varias opciones. Simplemente puede ampliar el separador de vista a la derecha por lo que es, en parte no visible, para empezar. Cuando la vista del contenido es empujado a la izquierda, el anterior no parte visible ahora será visible. No es mi favorito pero funciona. Entonces usted podría utilizar autodiseño en combindation con un personalizados en formato tableview clase de células. Pin de la seprartor a la parte inferior y líder de la vista de contenido, pero al final el de la propia célula. De esta manera, aun cuando el contenido de la vista es contratado, el separador se extiende todo el camino hasta el final.
  7. 3

    Esto es lo que finalmente ocurrió:

    Agrupados UITableview quitar exterior de la línea de separación

    Yo no era capaz de encontrar una forma mejor que esto. Pero se está trabajando para mí en gran medida. Última probado con la Versión de Xcode 7.3.1 (7D1014). Este procedimiento se realiza a través de guión gráfico.

    Básicamente puedo añadir un UIView de 0.5 pt Altura sobre el UITableViewCell y, a continuación, establecer un color de fondo para que UIView. Conjunto de padres UITableView del Separador como Ninguno.

    Aquí los detalles:

    Teniendo en cuenta que ya establece su UITableViewCell, personalizado o predeterminado. En la primera etapa de conjunto de la UITableView del separador como Ninguno.

    Agrupados UITableview quitar exterior de la línea de separación

    A continuación, agregue un UIView de 1 pt de Altura y el de Fondo como usted necesita, en mi caso es de color Rojo.

    Agrupados UITableview quitar exterior de la línea de separación

    Agrupados UITableview quitar exterior de la línea de separación

    De iniciar la configuración de las restricciones. El problema es establecer la altura de la UIView como 0,5 pt. Esta es la única cuestión Problemática para este flujo de trabajo.

    UIView con 0.5 pt Altura:

    Compartiendo el camino para establecer 0.5 pt altura de la UIView.

    Primero(1) pasador de la vista y, a continuación, (2) establecer la altura de 0.5. Presione Entrar.

    Agrupados UITableview quitar exterior de la línea de separación

    Finalmente su UIView será similar como la siguiente.

    Agrupados UITableview quitar exterior de la línea de separación

    Yo no era capaz de establecer la altura de 0.5 a otros de esta manera.

  8. 3

    Para la eliminación de la parte superior y la parte inferior de la línea de separación para cada sección. Agregue esto a la estática de la célula.

    override func layoutSubviews() {
        super.layoutSubviews()
    
        //Get the width of tableview
        let width = subviews[0].frame.width
    
        for view in subviews where view != contentView {
            //for top and bottom separator will be same width with the tableview width
            //so we check at here and remove accordingly
            if view.frame.width == width {
                view.removeFromSuperview()
            }
        }
    }

    Resultado de la siguiente imagen

    Agrupados UITableview quitar exterior de la línea de separación

  9. 2

    Aquí la solución. Esto es para las células de la estáticas. Si desea dinámica, a continuación, acaba de escribir «recuento». Espero que ayude.

    extension NSObject {
       var theClassName: String {
           return    NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!
       }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.separatorStyle = .None
    }
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        let count = tableView.numberOfRowsInSection(indexPath.section)
        if ( indexPath.row != count - 1 ) {
            for view in cell.subviews {
                if view.theClassName == "_UITableViewCellSeparatorView" {
                    view.backgroundColor = UIColors.redColor()
                }
            }
        }
    }
    • Que se parece a una terriblemente complicada solución. Si usted tiene una estática en formato tableview, ¿por qué no establecer el separador a ninguno y añadir un poco de vistas personalizadas con 1p altura a la estática de las células donde ellos quieren?
    • Honestamente, yo no soy un gran fan de el tweak dentro del marco de iOS porque puede ser cambiado posteriormente. De manera que puede haber un problema con la versión de la aplicación.
  10. 1

    Probado varias soluciones basadas en la cell.separatorInset = UIEdgeInsetsMake() solución, ninguno de ellos funciona correctamente.

    Para mi iOS11 UITableViewStyleGrouped basado en proyecto, este lo hice:

    self.tableView.separatorColor = self.tableView.backgroundColor;
  11. 1

    Basa en cocinar la respuesta, pero sin un temporizador:

    override func didAddSubview(_ subview: UIView) {
        super.didAddSubview(subview)
        if NSStringFromClass(subview.classForCoder) != "UITableViewCellContentView" && subview.frame.width == frame.width {
            subview.removeFromSuperview()
        }
    }

    Sólo tiene que añadir esta en una celda de la subclase y no necesita nada más. Funciona en iOS 12.

  12. 0

    Tuve un problema similar, donde tenía un Agrupados UITableView con la costumbre de las células, todo diseñado con Interfaz de Construir .xib archivos. Las células se habían fondo blanco, eliminado el defecto separadores, y añadió los míos propios. Yo también había Encabezado personalizado Vistas de cada sección. Me puse a la altura de aquellos Encabezado Vistas a ser 44 (podría ser cualquier cosa…). Hubo un 1 altura en el punto de vista de entre mis secciones, que parecía extraño. Al parecer, el sistema añade algunos clara visión de fondo entre las secciones, incluso si se especifica la altura personalizada a ser, es decir, de 44, y el Encabezado personalizado Vista volvemos tiene un blanco (o algunos de hormigón color de fondo). El color que vemos detrás de esa visión clara es el color de la Tabla de la Vista de los antecedentes de hecho. En mi caso, tanto las vistas de tabla y las celdas tenían que ser de color blanco, y configurar el fondo de la tabla de la vista de blanco resuelto el problema (al menos visualmente, pero que es lo que yo quería de todos modos). La segunda solución sería la de mantener la Tabla de Vista del estilo, tan claro, pero implementar el UITableView delegado método para devolver 2 o más secciones, y también crear los encabezados personalizados si es necesario. Pero que va a hacer encabezado vistas a pegarse a la parte superior por un tiempo (mientras que el desplazamiento), hasta la siguiente sección de encabezado de la vista se acerca más, y luego empieza a subir demasiado (y eso no puede ser lo que usted realmente quiere, pero no puede ser una manera fácil de arreglar eso, aunque no estoy seguro).

  13. 0

    Puede acceder a la vista mediante

    override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    
        let header = view as! UITableViewHeaderFooterView 
        header.backgroundView . .....
  14. 0

    Tratar de esto, le quite la parte superior del separador de línea.

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0 && indexPath.section == 0) {
            for (UIView *view in  cell.subviews) {
                if ([NSStringFromClass([view class]) containsString:@"CellSeparator"]) {
                    if (view.frame.origin.y == 0 && CGRectGetHeight(view.frame) < 1.01 ) { //Hide first UITableViewCellSeparatorView
                        NSLog(@"%s Remove View From Cell[Section:0 Row:0] for top border [%@]:%@",__FUNCTION__,NSStringFromClass([view class]),view);
                        view.hidden = YES; //Hide
                    }
                }
            }
        }
    }
  15. -1

    Aquí es una solución rápida que funciona en iOS 8 y 9.

    Definir un protocolo con una implementación predeterminada:

    protocol CellSeparatorRemovable { }
    
    extension CellSeparatorRemovable {
        func removeSeparatorLinesFromCell(cell: UITableViewCell, section: Int, row: Int, indexPath: NSIndexPath) {
            guard (section, row) == (indexPath.section, indexPath.row) else { return }
    
            for view in cell.subviews where view != cell.contentView {
                view.removeFromSuperview()
            }
        }
    }

    Entonces, dondequiera que usted quiere usar, se ajustan a la CellSeparatorRemovable protocolo y llamar a su método de …willDisplayCell…:

    class SomeVC: UITableViewController, CellSeparatorRemovable {
        override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
            removeSeparatorLinesFromCell(cell, section: 1, row: 1, indexPath: indexPath)
        }
    }

    Esta es una solución mínima; usted puede necesitar para refactorizar si usted está tratando con muchas células para evitar el exceso de recursividad y/o de células de la reutilización.

    • Hola @Aaron he intentado la solución, pero el separador sólo desaparece una vez que la célula se vuelve a dibujar (cuando se desplaza y se sale de la pantalla y, a continuación, desplazarse), pero la primera vez que la pantalla se carga el separador está ahí. Traté de células.setNeedsLayout() y la celda.setNeedsDisplay(). Alguna idea de cómo solucionarlo?
    • Al final he tenido subclase UITableViewCell y reemplazar layoutSubviews()
    • hackear la vista de jerarquía no es probablemente una buena solución. Esto podría cambiar en cualquier momento. También no es necesario para el dibujo personalizadas. Por favor, echa un vistazo a mi respuesta sobre cómo resolver la OPs problema de la mejor manera

Dejar respuesta

Please enter your comment!
Please enter your name here