¿Es posible deshabilitar encabezados flotantes en UITableView con UITableViewStylePlain?

177

Estoy usando un UITableViewdiseño de 'páginas' de contenido. Estoy usando los encabezados de la vista de tabla para diseñar ciertas imágenes, etc. y preferiría que no flotaran pero permanecieran estáticas como lo hacen cuando el estilo está configurado UITableViewStyleGrouped.

Aparte de usar UITableViewStyleGrouped, ¿hay alguna manera de hacer esto? Me gustaría evitar el uso agrupado, ya que agrega un margen hacia abajo en todas mis celdas y requiere deshabilitar la vista de fondo para cada una de las celdas. Me gustaría tener el control total de mi diseño. Idealmente, serían un "UITableViewStyleBareBones", pero no vi esa opción en los documentos ...

Muchas gracias,

Difícil
fuente
59
Use el estilo de tabla UITableViewStyleGrouped : esta es la respuesta para todos los que buscan deshabilitar encabezados flotantes y no leen toda la pregunta (me pasó a mí ...).
promedio Joe
@Kasztan ¡Esta es una solución de línea cero que funciona muy bien! Gracias.
Lee Fastenau

Respuestas:

27

Debería poder fingir esto utilizando una celda personalizada para hacer sus filas de encabezado. Estos se desplazarán como cualquier otra celda en la vista de tabla.

Solo necesita agregar algo de lógica en su cellForRowAtIndexPathpara devolver el tipo de celda correcto cuando se trata de una fila de encabezado.

Sin embargo, probablemente tendrá que administrar sus secciones usted mismo, es decir, tener todo en una sección y falsificar los encabezados. (También puede intentar devolver una vista oculta para la vista de encabezado, pero no sé si eso funcionará)

frankodwyer
fuente
11
Sí ... aunque parece un poco hack. Esto parece un descuido por parte de Apple, ya que claramente el código está ahí para hacerlo, solo necesitamos poder establecer una bandera.
Tricky
2
Comprueba mi respuesta a continuación para ver la forma correcta de lograr el efecto sin ningún truco especial, ¡solo administra la primera celda de cada sección como su encabezado de sección!
Sumit Anantwar
338

Una forma probablemente más fácil de lograr esto:

C objetivo:

CGFloat dummyViewHeight = 40;
UIView *dummyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, dummyViewHeight)];
self.tableView.tableHeaderView = dummyView;
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0);

Rápido:

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)

Los encabezados de sección ahora se desplazarán como cualquier celda normal.

samvermette
fuente
55
¡Este maldito funciona como un encanto! La presencia de un encabezado de vista de encabezado de tabla impide que los encabezados de sección floten. Y un encabezado invisible con inserciones de contenido apropiadas para la tabla hace el truco ... ¡Muchas gracias! me pregunto por qué esta respuesta no recibe tanta atención
Shyam Bhat
44
¡Aún no lo creo! Sin API privadas, sin profundizar en las clases, ¡nada! He estado enfrentando este problema durante años y he estado agregando vistas de tabla en la parte superior de las vistas de desplazamiento (con el desplazamiento de vista de tabla deshabilitado), lo que haría que los encabezados de la tabla se desplazaran normalmente. pero acabo de comenzar a buscar si Apple ha proporcionado algún método nuevo últimamente para solucionar esto ... así que me alegro de haber encontrado tu respuesta. gracias de nuevo
Shyam Bhat
13
El único inconveniente que vi es que el encabezado superior ya no se mostrará (puede verlo solo al desplazarse hacia arriba). Al menos para mí no se muestra
Ruzard
55
Todavía puede mostrar el tableHeaderView de la tabla aumentando su altura en la parte superior, en un número igual a la altura del encabezado de sección y reduciendo el contenido en el mismo número.
Shyam Bhat
2
Desearía poder votar de nuevo, estoy bastante seguro de que esta es al menos la tercera vez que termino con esta pregunta y esto ha resuelto mi problema.
Ell Neal
252

(Para quien llegó aquí debido a un estilo de tabla incorrecto) Cambie el estilo de tabla de plano a agrupado, a través del inspector de atributos o a través del código:

let tableView = UITableView(frame: .zero, style: .grouped)
david72
fuente
3
Esto es exactamente lo que estaba buscando. ¡Gracias!
ninjudd
44
"Aparte de usar UITableViewStyleGrouped, ¿hay alguna manera de hacer esto?"
Michael Peterson el
27
Lo bueno es que aprendí a verificar todas las respuestas antes de implementar la más votada :)
Tung Fam
1
Ahora bien, esta es la respuesta que buscaban. Tenga en cuenta que también puede encontrar la TableView Stylepropiedad en AttributesInspector.
Cristian Holdunu
44
La pregunta menciona específicamente buscar una forma "que no sea usar UITableViewStyleGrouped"
Ferdz
73

ADVERTENCIA : esta solución implementa un método de API reservado. Esto podría evitar que Apple apruebe la aplicación para su distribución en la AppStore.

Describí los métodos privados que hacen que los encabezados de sección floten en mi blog

Básicamente, solo necesita subclasificar UITableViewy regresar NOen dos de sus métodos:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;
calce
fuente
40
Una respuesta no merece un voto negativo solo porque hace referencia a API privadas (no todos escriben código para enviarlo a la AppStore). Esto es doblemente cierto cuando la respuesta es correcta. Subclasificar (o, más fácilmente, crear una categoría UITableView) que devuelve NO para estos métodos evita que los encabezados floten. Si desea ver esto agregado como una API pública, presente un informe de error
bugreport.apple.com
55
Si implementamos esa función en una aplicación, ¿cómo se daría cuenta Apple de que está utilizando una API privada? Por lo que saben, acabo de implementar un método en una subclase de UITableView, y ni siquiera pueden ver eso sin desmontar el código, y no sería tan fácil. No está LLAMANDO a un método en una API privada, solo está implementando uno ...
Javier Soto
3
@jemmons si no quieres que rechace tu respuesta, márcala como "aquí se usa una API privada". Una especie de descargo de responsabilidad :)
kas-kad
2
Su enlace "mi blog" está roto
MartinMoizard
12
@jemmons "no todo el mundo está escribiendo un código para enviarlo a la AppStore". La Appstore no es realmente el problema. El problema es que Apple puede cambiar las API privadas sin comunicar o descartar lo que dañará su aplicación. Esa es una mejor razón por la que no deberías usar API privadas que ser rechazado por Apple
2015
29

Ok, sé que es tarde pero tuve que hacerlo. Llevo 10 horas buscando una solución que funcione pero no encontré una respuesta completa. Encontré algunas pistas pero difícil de entender para los principiantes. Así que tuve que poner mis 2 centavos y completar la respuesta.

Como se ha sugerido en algunas de las respuestas, la única solución de trabajo que pude implementar es insertar celdas normales en la vista de tabla y manejarlas como encabezados de sección, pero la mejor manera de lograrlo es insertando estas celdas en fila 0 de cada sección. De esta manera podemos manejar estos encabezados personalizados no flotantes muy fácilmente.

Entonces, los pasos son.

  1. Implemente UITableView con estilo UITableViewStylePlain.

    -(void) loadView
    {
        [super loadView];
    
        UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
        tblView.delegate=self;
        tblView.dataSource=self;
        tblView.tag=2;
        tblView.backgroundColor=[UIColor clearColor];
        tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
    }
  2. Implemente titleForHeaderInSection como de costumbre (puede obtener este valor usando su propia lógica, pero prefiero usar delegados estándar).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Número de ejemplo de Secciones en Tabla Ver como de costumbre

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Implemente numberOfRowsInSection como de costumbre.

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    {
        int rowCount = [[cellArray objectAtIndex:section] count];
        return rowCount +1; //+1 for the extra row which we will fake for the Section Header
    }
  5. Devuelve 0.0f en heightForHeaderInSection.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. NO implemente viewForHeaderInSection. Elimine el método por completo en lugar de devolver nulo.

  7. En heightForRowAtIndexPath. Compruebe si (indexpath.row == 0) y devuelva la altura de celda deseada para el encabezado de sección, de lo contrario, devuelva la altura de la celda.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if(indexPath.row == 0)
        {
            return 80; //Height for the section header
        }
        else
        {
            return 70; //Height for the normal cell
        }
    }
  8. Ahora en cellForRowAtIndexPath, verifique si (indexpath.row == 0) e implemente la celda como desea que sea el encabezado de la sección y establezca el estilo de selección en none. ELSE implementa la celda como desea que sea la celda normal.

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
            if (cell == nil)
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
    
                cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
            }
    
            cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
    
            return cell;
        }
        else
        {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    
            if (cell == nil) 
            {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
                cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
    
                cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
                cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
            }
    
            cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
    
            return cell;
        }
    }
  9. Ahora implemente willSelectRowAtIndexPath y devuelva nil si indexpath.row == 0. Esto cuidará de que didSelectRowAtIndexPath nunca se active para la fila del encabezado de la Sección.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. Y finalmente en didSelectRowAtIndexPath, verifique si (indexpath.row! = 0) y continúe.

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row != 0)
        {
            int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
    
            //Do what ever you want the selection to perform
        }
    }

Con esto has terminado. Ahora tiene un encabezado de sección perfectamente flotante y no flotante.

Sumit Anantwar
fuente
1
Se implementó 'willSelectRowAtIndexPath' para que el control nunca llegue a 'didSelectRowAtIndexPath' al seleccionar la fila del encabezado de sección.
Sumit Anantwar
En realidad, doblo + desplego las filas cuando se selecciona el encabezado. Pero es bueno saber que puedes hacer eso
Yariv Nissim
Gran respuesta, pero ¿por qué el 'if (indexPath.row! = 0)' check in 'didSelectRowAtIndexPath'? ¿Es solo para estar más seguro? La fila nunca puede ser 0 con su implementación 'willSelectRowAtIndexPath', ¿verdad?
Glenn85
1
@ Glenn85, perdón por la respuesta tardía. Sí, es solo por una seguridad adicional.
Sumit Anantwar
28

En su Interface Builder, haga clic en la vista de tabla problemática

vista de tabla de problemas

Luego navegue al Inspector de atributos y cambie Style Plain a Grouped;) Easy

fácil

HannahCarney
fuente
17

Lo interesante de UITableViewStyleGrouped es que tableView agrega el estilo a las celdas y no a TableView.

El estilo se agrega como backgroundView a las celdas como una clase llamada UIGroupTableViewCellBackground que maneja el dibujo de diferentes fondos de acuerdo con la posición de la celda en la sección.

Entonces, una solución muy simple será usar UITableViewStyleGrouped, establecer el backgroundColor de la tabla en clearColor y simplemente reemplazar el backgroundView de la celda en cellForRow:

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];
adamsiton
fuente
1
Esta debería ser la mejor respuesta. Hay una publicación de blog al respecto aquí: corecocoa.wordpress.com/2011/09/17/…
Sam
Esta solución realmente no funciona. Sigo obteniendo un espacio extra alrededor de las celdas. Alguna idea ?
gsempe
2
¿No se desplazaría la vista de contenido de las celdas hacia la derecha?
Piotr Tomasik
15

Cambie su estilo de TableView:

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Según la documentación de Apple para UITableView:

UITableViewStylePlain- Una vista de tabla simple. Cualquier encabezado o pie de página se muestra como separador en línea y flotante cuando se desplaza la vista de tabla.

UITableViewStyleGrouped: una vista de tabla cuyas secciones presentan distintos grupos de filas. Los encabezados y pies de página no flotan.

Aks
fuente
5

Hay otra forma complicada. La idea principal es duplicar el número de sección, y el primero solo muestra el headerView mientras que el segundo muestra las celdas reales.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

Lo que hay que hacer entonces es implementar los delegados headerInSection:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Este enfoque también tiene poco impacto en sus fuentes de datos:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

En comparación con otros enfoques, esta forma es segura sin cambiar el marco o el contenido de la vista de tabla. Espero que esto pueda ayudar.

carril
fuente
5

La forma más fácil de obtener lo que desea es establecer su estilo de tabla como UITableViewStyleGrouped, estilo separador como UITableViewCellSeparatorStyleNone:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

No intente devolver la vista del pie de página como nil, no olvide establecer la altura del encabezado y la vista del encabezado, después de que debe obtener lo que desea.

Michail Pidgorodetskiy
fuente
4

Aunque esto puede no resolver su problema, lo hizo para mí cuando quería hacer algo similar. En lugar de configurar el encabezado, utilicé el pie de página de la sección anterior. Lo que me salvó fue que esta sección era pequeña y de naturaleza estática, por lo que nunca se desplazó por debajo de la parte inferior de la vista.

Torbjörn
fuente
Gran idea. Me encanta este truco
Steve Moser
un poco gracioso. aprecio la idea, pero un hack es un hack. los encabezados comenzarían a flotar en la parte inferior, así que realmente no resuelve el problema
Shyam Bhat
4

Para Swift 3+

Simplemente use UITableViewStyleGroupedy ajuste la altura del pie de página a cero con lo siguiente:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Tamás Sengel
fuente
1
Puede devolver 0 en lugar de .leastNormalMagnitude. También debe implementartableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim
@IliasKarim Al establecerlo en 0, tiene una altura distinta de cero. Además, no es necesario implementar la viewForFooterInSectionfunción en este caso.
Tamás Sengel
0y .leastNormalMagnitudetuvo el mismo efecto. Implementar el viewForFooterSectionmétodo es necesario. Deberías volver nulo. Esto está en Swift 5.1 con Xcode 11.3.1.
Ilias Karim
3

Mientras pensaba cómo abordar este problema, recordé un detalle muy importante sobre UITableViewStyleGrouped. La manera en que UITableView implementa el estilo agrupado (los bordes redondeados alrededor de las celdas) es agregando un backgroundView personalizado a UITableViewCells, y no a UITableView. A cada celda se le agrega un backgroundView de acuerdo con su posición en la sección (las filas superiores obtienen la parte superior del borde de la sección, las del medio obtienen el borde lateral y la inferior obtiene, bueno, la parte inferior). Entonces, si solo queremos un estilo simple, y no tenemos una vista de fondo personalizada para nuestras celdas (que es el caso en el 90% de las veces), entonces todo lo que tenemos que hacer es usar UITableViewStyleGrouped y eliminar el fondo personalizado . Esto se puede hacer siguiendo esos dos pasos:

Cambie nuestro estilo tableView a UITableViewStyleGrouped Agregue la siguiente línea a cellForRow, justo antes de devolver la celda:

cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease];

Y eso es. El estilo tableView será exactamente igual a UITableViewStylePlain, a excepción de los encabezados flotantes.

¡Espero que esto ayude!

James Laurenstin
fuente
2

Tal vez podría usar scrollViewDidScrollen la tabla Ver y cambiar elcontentInset basado en el encabezado visible actual.

Parece que funciona para mi caso de uso!

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}
Martín
fuente
1

Otra forma de hacerlo es hacer una sección vacía justo antes de la que desea el encabezado y colocar su encabezado en esa sección. Como la sección está vacía, el encabezado se desplazará inmediatamente.

devguydavid
fuente
1

Puede agregar una sección (con cero filas) arriba, luego establecer la sección anteriorFooterView como headerView de la sección actual, footerView no flota. Espero que te ayude.

Lee Lam
fuente
FooterViews flotan, al igual que HeaderViews. Simplemente flotan en la parte inferior de la pantalla, no en la parte superior.
Mark A. Donohoe
0

Ignora XAK. No explore ningún método privado si desea que su aplicación tenga la posibilidad de ser aceptada por Apple.

Esto es más fácil si está utilizando Interface Builder. Agregaría una vista UIView en la parte superior de la vista (donde irán las imágenes), luego agregará su vista de tabla debajo de eso. IB debería dimensionarlo en consecuencia; es decir, la parte superior de la vista de tabla toca la parte inferior de la UIView que acaba de agregar y su altura cubre el resto de la pantalla.

El pensamiento aquí es que si esa UIView no es realmente parte de la vista de tabla, no se desplazará con la vista de tabla. es decir, ignorar el encabezado de la vista de tabla.

Si no está utilizando el creador de interfaces, es un poco más complicado porque debe obtener el posicionamiento y la altura correctos para la vista de tabla.

imnk
fuente
Esto no responde la pregunta. Tricky se refiere a titleHeaderViews, que son las vistas que se encuentran entre las celdas, no a la vista del encabezado de la tabla, que es lo que parece sugerir.
Daniel Wood
0

Verifique la respuesta sobre cómo implementar encabezados con StoryBoard: Vistas de encabezado de tabla en StoryBoards

También tenga en cuenta que si no implementa

viewForHeaderInSection:(NSInteger)section

no flotará, que es exactamente lo que quieres.

Raphael Oliveira
fuente
0

Para eliminar completamente las secciones de encabezado de sección flotante, puede hacer esto:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil no funciona

Para deshabilitar los encabezados de sección flotantes pero aún mostrar, puede proporcionar una vista personalizada con sus propios comportamientos.

djskinner
fuente
0

Una variación de la solución de @ samvermette:

/// Allows for disabling scrolling headers in plain-styled tableviews
extension UITableView {

    static let shouldScrollSectionHeadersDummyViewHeight = CGFloat(40)

    var shouldScrollSectionHeaders: Bool {
        set {
            if newValue {
                tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: bounds.size.width, height: UITableView.shouldScrollSectionHeadersDummyViewHeight))
                contentInset = UIEdgeInsets(top: -UITableView.shouldScrollSectionHeadersDummyViewHeight, left: 0, bottom: 0, right: 0)
            } else {
                tableHeaderView = nil
                contentInset = .zero
            }
        }

        get {
            return tableHeaderView != nil && contentInset.top == UITableView.shouldScrollSectionHeadersDummyViewHeight
        }
    }

}
raf
fuente
0

El fragmento muestra un encabezado adhesivo solo para la primera sección. Otros encabezados de sección flotarán con celdas.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    if section == 1 {
        tableView.contentInset = .zero
    }

}

func tableView(_ tableView: UITableView, didEndDisplayingHeaderView view: UIView, forSection section: Int) {
    if section == 0 {
        tableView.contentInset = .init(top: -tableView.sectionHeaderHeight, left: 0, bottom: 0, right: 0)
    }
}
Adobels
fuente
-1

Esto se puede lograr asignando la vista de encabezado manualmente en el método viewDidLoad de UITableViewController en lugar de usar viewForHeaderInSection y heightForHeaderInSection del delegado. Por ejemplo, en su subclase de UITableViewController, puede hacer algo como esto:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *headerView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 40)];
    [headerView setBackgroundColor:[UIColor magentaColor]];
    [headerView setTextAlignment:NSTextAlignmentCenter];
    [headerView setText:@"Hello World"];
    [[self tableView] setTableHeaderView:headerView];
}

La vista del encabezado desaparecerá cuando el usuario se desplace. No sé por qué esto funciona así, pero parece lograr lo que estás buscando hacer.

Johnny Oshika
fuente
Esto no es para una sección, es para 1 encabezado en la parte superior.
makdad
-1

Quizás pueda simplemente hacer que el fondo de la vista de encabezado sea transparente:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {
    view.tintColor = [UIColor clearColor];
}

O aplícalo globalmente:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];
Tinpont
fuente
-2

Tengo otra solución aún más simple, para usar sin autolayout y con todo hecho a través de XIB:

1 / Coloque su encabezado en la vista de tabla arrastrándolo y soltándolo directamente en la vista de tabla.

2 / En el Inspector de tamaño del encabezado recién creado, simplemente cambie su tamaño automático: solo debe dejar los anclajes superior, izquierdo y derecho, más el relleno horizontalmente.

Así es como debe establecerse para el encabezado

Eso debería hacer el truco !

CyberDandy
fuente
-2

De acuerdo con la respuesta de @ samvermette, he implementado el código anterior en Swift para facilitar a los codificadores el uso de swift.

let dummyViewHeight = CGFloat(40)
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
self.tableView.contentInset = UIEdgeInsetsMake(-dummyViewHeight, 0, 0, 0)
Bingerz
fuente
-2

ref: https://stackoverflow.com/a/26306212

let tableView = UITableView(frame: .zero, style: .grouped)

PLUS

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return 40
    }else{
        tableView.sectionHeaderHeight = 0
    }

    return 0
}

Esto ayudó a usar el espacio del encabezado

Pratik
fuente
Por favor, no hagas eso🙏
MQoder
-3

2020 Última actualización

Probado con Xcode 14.

Para ocultar cualquier encabezado de sección, devuelva nulo para el título del delegado de sección

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return nil
}
Saranjith
fuente
-4

puede lograrlo fácilmente implementando el método viewForHeaderInSection en la clase delegada tableview. Este método espera una UIView como objeto de retorno (que es su vista de encabezado). He hecho lo mismo en mi código

Raj
fuente
El póster original no quiere un encabezado personalizado. Quieren un encabezado que no "flote" en la parte superior de la tabla. Tu sugerencia aún flota.
jemmons
cambie la vista de tabla a UITableViewStyleGrouped con viewforheader, luego se detendrá
mskw