Eliminar separadores adicionales debajo de UITableView

715

Cuando configuro una vista de tabla con 4 filas, todavía hay líneas de separadores adicionales (o celdas en blanco adicionales) debajo de las filas rellenas.

¿Cómo eliminaría estas células?

imagen para líneas de separación adicionales en UITableView

RoundOutTooSoon
fuente

Respuestas:

1506

Constructor de interfaces (iOS 9+)

Simplemente arrastre un UIView a la mesa. En el guión gráfico, se ubicará en la parte superior debajo de las celdas personalizadas. Es posible que prefiera llamarlo "pie de página".

Aquí se muestra en verde para mayor claridad, probablemente desee un color claro.

Tenga en cuenta que al ajustar la altura, puede afectar la forma en que se maneja el "rebote inferior" de la tabla, como prefiera. (La altura cero suele estar bien).

ingrese la descripción de la imagen aquí


Para hacerlo programáticamente:

Rápido

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

C objetivo

iOS 6.1 o superior

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

o si lo prefieres

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Históricamente en iOS:

Agregar al controlador de vista de tabla ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

y si es necesario ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
fuente
Creo que sus descripciones y su código están invertidos. De todos modos, esto funcionó muy bien para mí. Solo uso pies de página "reales" con tablas agrupadas, así que agregué if (tableView.style! = UITableViewStyleGrouped) {} ​​alrededor de su código. Ahora todas mis tablas no agrupadas pierden sus celdas adicionales, mientras que mis tablas agrupadas no se ven afectadas.
arlomedia
Siguiendo mi nota anterior, agregaré una advertencia de que si pone alguna condición en el método viewForFooterInSection, asegúrese de que el método devuelva UIView o nil. Si accidentalmente devuelve vacío, su aplicación se bloqueará.
arlomedia
44
@Mathieu Esto funcionará porque si la tabla tiene un pie de página personalizado, no creará filas "fantom" para llenar la vista de tabla. Entonces, creará una vista vacía para usar como pie de página y establecerá la altura cerca de 0 (no podría ser cero o el iOS no lo representará). Con este simple truco, cambiará el comportamiento predeterminado.
J. Costa
2
@ j.Costa: su solución funcionará solo una vez mientras se crea uitableview. Después de hacer clic en la última celda, su solución no es más buena. Por favor, mejora tu respuesta.
3
El uso tableFooterViewdeja un separador en la última celda de la fila, ya que la tabla todavía anticipa el contenido debajo de esa celda. Usar la forma histórica eliminará ese último separador y se verá mejor en general.
James Kuang
128

Aquí hay otra forma de hacerlo sin el estilo de tabla agrupada, y una que probablemente no adivinará. Agregar un encabezado y pie de página a la tabla (tal vez uno u otro es suficiente, no se ha marcado) hace que los separadores desaparezcan de las filas de relleno / en blanco.

Me topé con esto porque quería un poco de espacio en la parte superior e inferior de las mesas para disminuir el riesgo de presionar botones en lugar de una celda de la mesa con dedos carnosos. Aquí hay un método para pegar una vista en blanco como encabezado y pie de página. Use la altura que desee, aún elimina las líneas de separación adicionales.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

En respuesta a @Casebash, volví al código en mi aplicación ("AcmeLists" List Manager en la tienda de iTunes ...) y cortocircuité el método addHeaderAndFooter para verificar. Sin él , tengo los separadores de fila adicionales; con el código, tengo lo que ves en esta ventana: no hay imagen de separadores de fila de tabla . Así que no estoy seguro de por qué no habría funcionado para ti. Además, tiene sentido para mí que tener un pie de página personalizado en una vista de tabla necesariamente tenga que dejar de dibujar separadores de fila para filas en blanco debajo de él. Eso sería horrible. Como referencia, miré las tablas donde había más filas de las que se podían ver en la pantalla, y luego una tabla con dos filas. En ambos casos, no hay separadores extraños.

Quizás sus vistas personalizadas no se agregaron realmente. Para comprobar esto, establecer el color de fondo a algo distinto clearColor, por ejemplo, [UIColor redColor]. Si no ve algunas barras rojas en la parte inferior de la tabla, su pie de página no está configurado.

wkw
fuente
1
También puedes hacer esto en IB. Simplemente arrastre una UIView en la parte inferior de TableView y establezca la altura en 1.
Ortwin Gentz
70

Eliminar líneas de separación adicionales para filas vacías en UITableView en Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
dineshthamburu
fuente
34

Me gustaría extender la respuesta wkw :

Simplemente agregar solo pie de página con altura 0 hará el truco. (probado en SDK 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

o incluso más simple: cuando configure su vista de tabla, agregue esta línea:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

o incluso más simple: simplemente eliminar cualquier separador:

[_tableView setTableFooterView:[UIView new]];

Gracias a wkw otra vez :)

Guntis Treulands
fuente
Esta es la respuesta correcta, porque en otros métodos la última fila permanece sin separador de línea
Ankush
22

Para iOS 7+ con Storyboards

Simplemente arrastre UIViewa UITableViewcomo su pie de página. Establezca la altura de la vista de pie de página en 0.

Kyle Clegg
fuente
18

Prueba esto. A mí me funcionó:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
Ambili B Menon
fuente
14

Para Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Sebastian
fuente
11

Si está utilizando Swift, agregue el siguiente código para verDidLoad del controlador que administra la vista de tabla:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Babatunde Adeyemi
fuente
8

Puede agregar un pie de página vacío al final y luego ocultará las celdas vacías, pero también se verá bastante feo:

tableView.tableFooterView = UIView()

ingrese la descripción de la imagen aquí

Hay un mejor enfoque: agregue una línea de 1 punto al final de la vista de tabla como el pie de página y las celdas vacías tampoco se mostrarán más.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

ingrese la descripción de la imagen aquí

Darko
fuente
Muy buena entrada, sin embargo, no es necesario hacer su última celda con un color de separación grueso en la parte inferior, en su lugar, simplemente haga que sea el mismo color de fondo de la celda y también desaparece.
Gustavo Baiocchi Costa
Como prefieras. Pero creo que el separador "no completado" se ve bastante feo.
Darko
7

solo agregue este código ( Swift ). .

tableView.tableFooterView = UIView()
Roy
fuente
1
Duplicado de muchas respuestas, incluida la respuesta wiki superior y la respuesta de Sebastian
Coœur
7

Avanzando en la solución de J. Costa: puede hacer un cambio global en la tabla poniendo esta línea de código:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

dentro del primer método posible (generalmente en AppDelegate, en: application:didFinishLaunchingWithOptions:método).

o.shnn
fuente
2
Tenga cuidado con este, hay casos en los que su pie de página previsto puede anularse y pasará un día o dos cuestionando su cordura. Además, tableFooterView no está marcado con UI_APPEARANCE_SELECTOR, por lo que el comportamiento real podría cambiar en cualquier momento.
mwright
6

Sé que esta pregunta ha sido aceptada como respuesta, pero pongo aquí diferentes formas de cómo ocultar la línea de separación adicional de UITableView.

Puede ocultar tableViewla línea de separación estándar y agregar su línea personalizada en la parte superior de cada celda.

Actualizar:

La forma más fácil de agregar un separador personalizado es agregar simples UIView altura de 1 px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

O

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

O

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

O La mejor y más simple forma que me gusta es

self.tableView.tableFooterView = [[UIView alloc] init];

Prueba cualquiera de uno;

iPatel
fuente
6

Puede encontrar muchas respuestas a esta pregunta. La mayoría de ellos alrededor de la manipulación con UITableViewel tableFooterViewatributo de y esta es la forma correcta de ocultar filas vacías. Por conveniencia, he creado una extensión simple que permite activar / desactivar filas vacías desde Interface Builder. Puede consultarlo desde este archivo GIST . Espero que pueda ahorrar un poco de tu tiempo.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Uso:

tableView.isEmptyRowsHidden = true

ingrese la descripción de la imagen aquí

Stanislau Baranouski
fuente
5

uitableview línea de separación adicional ocultar líneas de separación adicionales ocultar en swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
fuente
5

Si no desea ningún separador después de la última celda, necesita una altura cercana a cero pero distinta de cero para su pie de página.

En su UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Coeur
fuente
1
¡soberbio! ¡¡Trabajó para mi!!
Antony Raphel
5

Swift funciona muy bien con:

tableView.tableFooterView = UIView()
Marcelo Gracietti
fuente
3

Simplemente agregue una vista con el color del separador deseado como color de fondo, 100% de ancho, 1px de altura en la posición x0 y-1 a su tableViewCell. Asegúrese de que tableViewCell no recorta subvistas, sino que tableView debería.

Por lo tanto, obtienes un separador simple y funcional solo entre las celdas existentes sin ningún hack por código o IB.

Nota: en un rebote vertical superior aparece el primer separador, pero eso no debería ser un problema porque es el comportamiento predeterminado de iOS.

maaalex
fuente
3

Estaba usando una vista de tabla para mostrar un número fijo de filas de altura fija, así que simplemente cambié el tamaño y lo hice no desplazable.

Casebash
fuente
3

Para eliminar las líneas de separación adicionales desde la parte inferior de UItableview mediante programación, simplemente escriba las siguientes dos líneas de código y eliminará el separador adicional.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Este truco funciona para mí todo el tiempo, pruébalo tú mismo.

Kalpesh Panchasara
fuente
2

Tuve suerte implementando una sola pieza de la respuesta aceptada (iOS 9+, Swift 2.2). Intenté implementar:

self.tableView.tableFooterView = UIView(frame: .zero)

Sin embargo, no hubo ningún efecto en mi tableView, creo que puede tener algo que ver con el hecho de que estaba usando UITableViewController.

En cambio, solo tuve que anular el viewForFooterInSectionmétodo (no configuré el tableFooterViewotro lugar):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Esto funcionó bien para una tableViewcon una sola sección (si tiene varias secciones, debe especificar la última).

PANECILLO EN ESCOCIA
fuente
2

Si solo tiene una sección, la forma más rápida y sencilla es configurar el Estilo de vista de tabla de "Normal" a "Agrupado". (ver imagen)

Vista de tabla agrupada

Si tiene más secciones, es posible que deba establecer la altura del encabezado en cero (dependiendo del gusto de su / su cliente / gerente de proyecto)

Si tiene más secciones y no desea meterse con los encabezados (incluso si es solo una línea en el caso más simple), entonces debe establecer una UIView como pie de página, como se explicó en las respuestas anteriores)

Pescado relleno
fuente
2

Extensión Swift 4.0

Solo una pequeña extensión para el guión gráfico:

ingrese la descripción de la imagen aquí

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Nik Kov
fuente
2

Rápido y fácil Swift de 4 vías.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Si tienes celdas estáticas. También puede desactivar el separador desde la ventana del Inspector. (Esto no será deseable si necesita el separador. En ese caso, utilice el método que se muestra arriba) ventana de inspector

Alix
fuente
Establecer una nueva UIView para tableFooterView ya fue respondido 10 veces, con mejores explicaciones sobre por qué, mejor código (te falta super.viewDidLoad()) y está incluido en la respuesta wiki en la parte superior. En cuanto a eliminar todos los separadores, de eso no se trata realmente esta pregunta, así que mejor deshaga su última edición y / o elimine su respuesta por completo.
Coeur
1

Si desea eliminar el espacio no deseado en UITableview, puede usar a continuación dos métodos

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Hari c
fuente
1

He agregado esta pequeña extensión de vista de tabla que ayuda en todo

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Suresh Varma
fuente
1

Intenta con esto

para el objetivo C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

para Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Atanu Mondal
fuente
0

Prueba esto

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
vishnu
fuente
0

UIKitno crea una celda vacía cuando tableViewtiene un tableFooterView. Entonces podemos hacer un truco y asignar un UIViewobjeto de altura cero como pie de página del tableView.

tableView.tableFooterView = UIView()
iMuzahid
fuente
0

En caso de que tenga un searchbaren su view(para limitar el número de resultados, por ejemplo), también debe agregar lo siguiente en shouldReloadTableForSearchStringyshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
usuario3900346
fuente
0

En Swift (estoy usando 4.0), puede lograr esto creando una UITableViewCellclase personalizada y overridingel setSelectedmétodo. Entonces separator insetstodo a 0 . (mi clase principal con la vista de tabla tiene un fondo claro) color.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
hoptown
fuente