È possibile disabilitare le intestazioni mobili in UITableView con UITableViewStylePlain?


177

Sto usando un ' UITableViewlayout' per il layout dei contenuti. Sto usando le intestazioni della vista tabella per impaginare determinate immagini ecc. E preferirei che non galleggiassero ma rimanessero statiche come fanno quando lo stile è impostato su UITableViewStyleGrouped.

A parte l'utilizzo UITableViewStyleGrouped, c'è un modo per farlo? Vorrei evitare di utilizzare il raggruppamento in quanto aggiunge un margine in basso a tutte le mie celle e richiede la disabilitazione della vista di sfondo per ciascuna delle celle. Vorrei il pieno controllo del mio layout. Idealmente sarebbero un "UITableViewStyleBareBones", ma non ho visto questa opzione nei documenti ...

Grazie molto,



59
Usa lo stile di tabella UITableViewStyleGrouped : questa è la risposta per tutti coloro che cercano di disabilitare le intestazioni mobili e non leggono l'intera domanda (è successo a me ...).
media Joe

@Kasztan Questa è una soluzione zero line che funziona alla grande! Grazie.
Lee Fastenau,

Risposte:


27

Dovresti essere in grado di fingere questo utilizzando una cella personalizzata per eseguire le righe di intestazione. Questi scorreranno quindi come qualsiasi altra cella nella vista tabella.

Hai solo bisogno di aggiungere un po 'di logica nel tuo cellForRowAtIndexPathper restituire il giusto tipo di cella quando si tratta di una riga di intestazione.

Tuttavia, probabilmente dovrai gestire tu stesso le sezioni, ovvero avere tutto in una sezione e falsare le intestazioni. (Potresti anche provare a restituire una vista nascosta per la vista dell'intestazione, ma non so se funzionerà)


11
Sì ... sembra un po 'un trucco però. Sembra una supervisione da parte di Apple, poiché chiaramente il codice è lì per farlo, dobbiamo solo essere in grado di impostare una bandiera.
Tricky,

2
Controlla la mia risposta qui sotto per il modo corretto di ottenere l'effetto senza alcun hack speciale, basta gestire la prima cella di ogni sezione come intestazione della sezione!
Sumit Anantwar,

338

Un modo probabilmente più semplice per raggiungere questo obiettivo:

Objective-C:

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);

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)

Le intestazioni di sezione ora scorreranno proprio come qualsiasi cella normale.


5
Questo effetto funziona come un fascino !! La presenza di un'intestazione della vista dell'intestazione della tabella impedisce alle intestazioni di sezione di fluttuare. E un'intestazione invisibile con inserti di contenuto appropriati per la tabella fa il trucco .. Grazie mille! mi chiedo perché questa risposta non stia ricevendo molta attenzione
Shyam Bhat

4
Ancora non ci credo! Niente API private, niente scavi nelle classi, niente! Ho affrontato questo problema per anni e ho aggiunto le visualizzazioni di tabella in cima alle visualizzazioni di scorrimento (con lo scorrimento della visualizzazione di tabella disabilitato), il che farebbe scorrere normalmente le intestazioni della tabella. ma ho appena iniziato a cercare se apple ha fornito nuovi metodi ultimamente per risolvere questo problema ... così felice di essermi imbattuto nella tua risposta. grazie ancora
Shyam Bhat l'

13
l'unico inconveniente che ho visto è che l'intestazione superiore non verrà più mostrata (puoi vederla solo scorrendo verso l'alto). Almeno per me non è mostrato
Ruzard il

5
Puoi comunque mostrare tableHeaderView della tabella aumentandone l'altezza in alto, di un numero uguale all'altezza dell'intestazione della sezione e riducendo l'inserzione del contenuto dello stesso numero.
Shyam Bhat,

2
Vorrei poter votare di nuovo questo, sono abbastanza certo che questa è almeno la terza volta che ho finito con questa domanda e questo ha risolto il mio problema.
Ell Neal,

252

(Per chi è mai arrivato qui a causa di uno stile di tabella errato) Cambia lo stile della tabella da semplice a raggruppato, tramite la finestra di ispezione degli attributi o tramite il codice:

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

3
Questo e 'esattamente quello che stavo cercando. Grazie!
ninjudd,

4
"A parte usare UITableViewStyleGrouped, c'è un modo per farlo?"
Michael Peterson,

27
Per fortuna ho imparato a controllare tutte le risposte prima di implementare quella più votata :)
Tung Fam

1
Ora, ragazzi, è la risposta che stavate cercando. Tenere presente che è possibile trovare la TableView Styleproprietà anche in AttributesInspector.
Cristian Holdunu

4
La domanda menziona specificamente di cercare un modo "Altro che usando UITableViewStyleGrouped"
Ferdz,

73

AVVERTIMENTO : questa soluzione implementa un metodo API riservato. Ciò potrebbe impedire all'app di essere approvata da Apple per la distribuzione sull'AppStore.

Ho descritto i metodi privati ​​che trasformano le intestazioni di sezione fluttuanti mio blog

Fondamentalmente, devi solo sottoclassare UITableViewe tornare NOin due dei suoi metodi:

- (BOOL)allowsHeaderViewsToFloat;
- (BOOL)allowsFooterViewsToFloat;

40
Una risposta non merita un downvote solo perché fa riferimento a API private (non tutti scrivono codice da inviare all'AppStore). Questo è doppiamente vero quando la risposta sembra essere corretta. La sottoclasse (o, più facilmente, la creazione di una categoria UITableView) che restituisce NO per questi metodi impedisce la fluttuazione delle intestazioni. Se desideri vederlo aggiunto come API pubblica, invia una segnalazione di bug: bugreport.apple.com
jemmons

5
Se implementiamo quella funzione in un'app, come realizzerebbe Apple che stai usando un'API privata? Da quello che sanno, ho appena implementato un metodo in una sottoclasse di UITableView e non riescono nemmeno a vederlo senza disassemblare il codice, e non sarebbe così facile. Non è CHIAMARE un metodo in un'API privata, ma solo implementarne uno ....
Javier Soto

3
@jemmons se non vuoi che io voti in basso la tua risposta, contrassegnala come "API privata viene utilizzata qui". Una sorta di dichiarazione di non responsabilità :)
kas-kad,

2
Il link "il mio blog" è interrotto
MartinMoizard,

12
@jemmons "non tutti scrivono codice da inviare all'AppStore" L'Appstore non è proprio il problema. Il problema è che Apple può modificare le API private senza comunicare o deprecare che interromperà la tua app. Questa è una ragione migliore per cui non dovresti usare API private che essere rifiutato da Apple
aryaxt

29

Ok, so che è tardi ma ho dovuto farlo. Ormai ho trascorso 10 ore alla ricerca di una soluzione funzionante ma non ho trovato una risposta completa. Ho trovato alcuni suggerimenti ma difficile da capire per i principianti. Quindi ho dovuto inserire i miei 2 centesimi e completare la risposta.

Come è stato suggerito nelle poche risposte, l'unica soluzione funzionante che sono stato in grado di implementare è l'inserimento di celle normali nella vista tabella e gestirle come intestazioni di sezione, ma il modo migliore per ottenerlo è inserendo queste celle in riga 0 di ogni sezione. In questo modo possiamo gestire facilmente queste intestazioni personalizzate non flottanti.

Quindi, i passaggi sono.

  1. Implementare UITableView con stile 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. Implementa titleForHeaderInSection come al solito (puoi ottenere questo valore usando la tua logica, ma preferisco usare delegati standard).

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
    {
        NSString *headerTitle = [sectionArray objectAtIndex:section];
        return headerTitle;
    }
  3. Numero di implementazioneOfSectionsInTableVisualizza come al solito

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    {
        int sectionCount = [sectionArray count];
        return sectionCount;
    }
  4. Implementare numberOfRowsInSection come al solito.

    - (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. Restituisce 0.0f in heightForHeaderInSection.

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
    {
        return 0.0f;
    }
  6. NON implementare viewForHeaderInSection. Rimuovere completamente il metodo invece di restituire zero.

  7. In heightForRowAtIndexPath. Controlla se (indexpath.row == 0) e restituisce l'altezza della cella desiderata per l'intestazione della sezione, altrimenti restituisce l'altezza della cella.

    - (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. Ora in cellForRowAtIndexPath, controlla se (indexpath.row == 0) e implementa la cella come desideri che sia l'intestazione della sezione e imposta lo stile di selezione su none. ELSE implementa la cella come vuoi che sia la cella normale.

    - (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. Ora implementa willSelectRowAtIndexPath e restituisce zero se indexpath.row == 0. Questo importerà che didSelectRowAtIndexPath non venga mai attivato per la riga dell'intestazione della sezione.

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (indexPath.row == 0)
        {
            return nil;
        }
    
        return indexPath;
    }
  10. E infine in didSelectRowAtIndexPath, controlla se (indexpath.row! = 0) e procedi.

    - (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 questo hai finito. Ora hai un'intestazione di sezione perfettamente scorrevole e non mobile.


1
Implementato "willSelectRowAtIndexPath" in modo che il controllo non raggiunga mai "didSelectRowAtIndexPath" selezionando la riga Intestazione di sezione.
Sumit Anantwar,

In realtà, piego + apro le righe quando viene selezionata l'intestazione. Ma è bello sapere che puoi farlo
Yariv Nissim,

Ottima risposta, ma perché "if (indexPath.row! = 0)" ha fatto il check-in "didSelectRowAtIndexPath"? È solo per essere più sicuro? La riga non può mai essere 0 con l'implementazione 'willSelectRowAtIndexPath', giusto?
Glenn85,

1
@ Glenn85, ci scusiamo per la risposta tardiva. Sì, è solo per una maggiore sicurezza.
Sumit Anantwar,

28

Nel tuo Interface Builder fai clic sulla vista tabella del tuo problema

vista tabella problemi

Quindi vai su Impostazioni attributi e cambia Stile semplice in Raggruppato;) Facile

facile


17

La cosa interessante di UITableViewStyleGrouped è che tableView aggiunge lo stile alle celle e non a TableView.

Lo stile viene aggiunto come backgroundView alle celle come una classe denominata UIGroupTableViewCellBackground che gestisce il disegno di uno sfondo diverso in base alla posizione della cella nella sezione.

Quindi una soluzione molto semplice sarà usare UITableViewStyleGrouped, impostare backgroundColor della tabella su clearColor e semplicemente sostituire backgroundView della cella in cellForRow:

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

1
Questa dovrebbe essere la risposta migliore. C'è un post sul blog qui: corecocoa.wordpress.com/2011/09/17/…
Sam

Questa soluzione non funziona davvero. Continuo a ottenere uno spazio extra intorno alle celle circostanti. Qualche idea ?
gsempe,

2
Il contentView delle celle non sarebbe ancora spostato a destra?
Piotr Tomasik,

15

Cambia il tuo stile TableView:

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

Come da documentazione Apple per UITableView:

UITableViewStylePlain: una vista tabella semplice. Eventuali intestazioni o piè di pagina di sezione vengono visualizzati come separatori in linea e mobili quando si scorre la vista tabella.

UITableViewStyleGrouped: una vista tabella le cui sezioni presentano gruppi distinti di righe. Le intestazioni e i piè di pagina della sezione non galleggiano.


5

C'è un altro modo complicato. L'idea principale è quella di raddoppiare il numero della sezione, e il primo mostra solo headerView mentre il secondo mostra le celle reali.

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

Ciò che è necessario fare è implementare i delegati 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;
}

Questo approccio ha anche un impatto limitato sulle tue origini dati:

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

Rispetto ad altri approcci, in questo modo è sicuro senza cambiare il frame o il contenuto. Inset della vista tabella. Spero che questo possa aiutare.


5

Il modo più semplice per ottenere ciò che desideri è impostare lo stile della tabella come UITableViewStyleGrouped, stile separatore come 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];
}

Non provare a restituire la vista piè di pagina come nil, non dimenticare di impostare l'altezza dell'intestazione e la vista dell'intestazione, dopo aver ottenuto ciò che desideri.


4

Anche se questo potrebbe non risolvere il tuo problema, lo ha fatto per me quando volevo fare una cosa simile. Invece di impostare l'intestazione ho usato il piè di pagina della sezione sopra. Ciò che mi ha salvato è che questa sezione era piccola e di natura statica, quindi non scorreva mai sotto il fondo della vista.


Grande idea. Adoro questo trucco.
Steve Moser,

un po 'divertente. apprezzo l'idea, ma un trucco è un trucco. le intestazioni inizierebbero a fluttuare sul fondo, quindi non risolve davvero il problema
Shyam Bhat l'

4

Per Swift 3+

Basta usare UITableViewStyleGroupede impostare l'altezza del piè di pagina a zero con quanto segue:

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
È possibile restituire 0 anziché .leastNormalMagnitude. Inoltre è necessario implementaretableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
Ilias Karim

@IliasKarim Impostandolo su 0 lo incassa per avere un'altezza diversa da zero. Inoltre, viewForFooterInSectionin questo caso non è necessario implementare la funzione.
Tamás Sengel,

0e ha .leastNormalMagnitudeavuto lo stesso effetto. L'implementazione del viewForFooterSectionmetodo è necessaria. Dovresti restituire zero. Questo è su Swift 5.1 con Xcode 11.3.1.
Ilias Karim,

3

Mentre pensavo come affrontare questo problema, ho ricordato un dettaglio molto importante su UITableViewStyleGrouped. Il modo in cui UITableView implementa lo stile raggruppato (i bordi arrotondati attorno alle celle) è aggiungendo uno sfondo personalizzato a UITableViewCells e non a UITableView. A ogni cella viene aggiunto uno sfondo Visualizza in base alla sua posizione nella sezione (le righe superiori ottengono la parte superiore del bordo della sezione, quelle centrali ottengono il bordo laterale e quella inferiore ottiene - beh, la parte inferiore). Quindi, se vogliamo solo uno stile semplice e non abbiamo uno sfondo personalizzato per le nostre celle (che è il caso nel 90% delle volte), allora tutto ciò che dobbiamo fare è usare UITableViewStyleGrouped e rimuovere lo sfondo personalizzato . Questo può essere fatto seguendo questi due passaggi:

Cambia il nostro stile tableView in UITableViewStyleGrouped Aggiungi la seguente riga a cellForRow, appena prima di restituire la cella:

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

E questo è tutto. Lo stile tableView diventerà esattamente come UITableViewStylePlain, ad eccezione delle intestazioni mobili.

Spero che questo ti aiuti!


2

Forse potresti usare scrollViewDidScrolltableView e cambiare ilcontentInset base all'intestazione visibile corrente.

Sembra funzionare per il mio caso d'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)
   }
}

1

Un altro modo per farlo è quello di creare una sezione vuota proprio prima di quella su cui vuoi inserire l'intestazione e posizionarla su quella sezione. Poiché la sezione è vuota, l'intestazione scorrerà immediatamente.


1

Puoi aggiungere una Sezione (con zero righe) sopra, quindi impostare la sezione precedente FooterView come headerView della sezione corrente, footerView non galleggia. Spero che ti dia un aiuto.


Le FooterViews fluttuano, proprio come HeaderViews. Galleggiano nella parte inferiore dello schermo, non in alto.
Mark A. Donohoe,

0

Ignora XAK. Non esplorare alcun metodo privato se desideri che la tua app abbia la possibilità di essere accettata da Apple.

Questo è più semplice se si utilizza Interface Builder. Dovresti aggiungere una vista UIV nella parte superiore della vista (dove andranno le immagini), quindi aggiungere la vista della tabella sotto quella. IB dovrebbe dimensionarlo di conseguenza; cioè, la parte superiore della vista tabella tocca la parte inferiore della vista UIV che hai appena aggiunto e la sua altezza copre il resto dello schermo.

Il pensiero qui è che se UIView non fa effettivamente parte della vista tabella, non scorrerà con la vista tabella. cioè ignora l'intestazione tableview.

Se non stai utilizzando Interface Builder, è un po 'più complicato perché devi ottenere il posizionamento e l'altezza corretti per la vista tabella.


Questo non risponde alla domanda. Tricky si riferisce al titoloHeaderViews che sono le viste che si trovano tra le celle, non la vista dell'intestazione della tabella che sembra suggerire.
Daniel Wood,


0

Per rimuovere completamente le sezioni di intestazione della sezione mobile, è possibile effettuare ciò:

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

return nil non funziona

Per disabilitare il floating ma mostrare comunque le intestazioni di sezione è possibile fornire una vista personalizzata con i propri comportamenti.


0

Una variazione sulla soluzione di @ 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
        }
    }

}

0

Lo snippet mostra un'intestazione appiccicosa solo per la prima sezione. Le altre intestazioni di sezione fluttuano con una cella.

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

-1

Ciò può essere ottenuto assegnando manualmente la vista dell'intestazione nel metodo viewDidLoad di UITableViewController invece di utilizzare viewForHeaderInSection e heightForHeaderInSection del delegato. Ad esempio nella sottoclasse di UITableViewController, puoi fare qualcosa del genere:

- (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 dell'intestazione scompare quindi quando l'utente scorre. Non so perché funzioni in questo modo, ma sembra raggiungere quello che stai cercando di fare.


Questo non è per una sezione, questo è per 1 intestazione in alto.
Makdad,

-1

Forse puoi semplicemente rendere trasparente lo sfondo della vista dell'intestazione:

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

O applicalo a livello globale:

    [UITableViewHeaderFooterView appearance].tintColor = [UIColor clearColor];

-2

Ho un'altra soluzione ancora più semplice, da utilizzare senza autolayout e con tutto ciò che viene fatto tramite XIB:

1 / Inserisci l'intestazione nella vista tabella trascinandola e rilasciandola direttamente sulla vista tabella.

2 / Nell'Ispettore dimensioni dell'intestazione appena creata, basta modificarne il ridimensionamento automatico: è necessario lasciare solo le ancore superiore, sinistra e destra, più il riempimento in orizzontale.

Ecco come dovrebbe essere impostato per l'intestazione

Questo dovrebbe fare il trucco!


-2

Secondo la risposta di @ samvermette , Ho implementato il codice sopra riportato in Swift per semplificare l'utilizzo da parte dei programmatori di 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)

-2

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

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

PLUSE

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

    return 0
}

Ciò ha contribuito a utilizzare lo spazio dell'intestazione


Per favore, non farlo🙏
MQoder

-3

2020 ultimo aggiornamento

Testato con Xcode 14.

Per nascondere qualsiasi intestazione di sezione, Restituire zero per il titolo del delegato di sezione

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

-4

puoi farlo facilmente implementando il metodo viewForHeaderInSection nella classe delegata tableview. questo metodo prevede una vista UIV come oggetto di ritorno (che è la vista dell'intestazione). ho fatto la stessa cosa nel mio codice


Il poster originale non vuole un'intestazione personalizzata. Vogliono un'intestazione che non "fluttui" nella parte superiore della tabella. Il tuo suggerimento galleggia ancora.
jemmons,

cambia la vista tabella in UITableViewStyleGrouped con viewforheader, quindi lo farà arrestare
mskw
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.