Perché c'è un'imbottitura extra nella parte superiore di UITableView con stile UITableViewStyle Raggruppato in iOS7


637

A partire da iOS7, c'è uno spazio aggiuntivo nella parte superiore del mio UITableViewche ha uno stile UITableViewStyleGrouped.

Ecco un esempio:

inserisci qui la descrizione dell'immagine

La vista tabella inizia dalla prima freccia, ci sono 35 pixel di riempimento inspiegabile, quindi l'intestazione verde viene UIViewrestituita da viewForHeaderInSection(dove la sezione è 0).

Qualcuno può spiegare da dove proviene questa quantità di 35 pixel e come posso liberarmene senza passare a UITableViewStylePlain?


Nota:

In iOS 11 e versioni successive:

tableView.contentInsetAdjustmentBehavior = .never

stai usando l'ultimo iOS 7? Alcuni di questi TIPI di incoerenze (ma non tutti, e forse non questo) sono stati curati durante le anteprime successive degli sviluppatori. Dovrei sapere: ho procrastinato così tanto che alcuni dei problemi sono scomparsi.
Dan Rosenstark,

Controllare risposta qui - stackoverflow.com/a/18986158/1463604
Nishant

La risposta breve è che questo riempimento extra è probabilmente dovuto all'intestazione della vista tabella (non all'intestazione della sezione) e che UITableViewnon gli piace essere assegnato a un'intestazione con un'altezza di 0,0. Controllare stackoverflow.com/a/31223403/1394534 per maggiori dettagli.
Aurelien Porte,

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];nota: 0.0fviene semplicemente ignorato se lo si utilizza all'altezza del rettangolo. Quindi usiamo il CGFloat più vicino a zero possibile (almeno questo "ha funzionato" per me ... semplicemente non la soluzione ideale).
Alejandro Iván,

1
@ AlejandroIván il tuo commento ha appena fatto la mia notte. Ho un tableView con prototipi raggruppati. Sto usando numberSections = data.count e impostando numberRows = 1. Ho impostato heightForFooterInSection per creare uno spazio pulito tra ciascuno e per qualche motivo è apparso un tableHeaderView vuoto.
Ryan Alexander,

Risposte:


863

Sono stato aiutato da quanto segue:

YouStoryboard.storyboard> YouViewController> Impostazioni attributi> Deseleziona - Regola gli inserti della vista di scorrimento.

inserisci qui la descrizione dell'immagine


42
Penso che questo sia il modo corretto di rimuovere quell'imbottitura, invece di manomettere i valori di edgeInset.
Hgeg,

21
Questo non ha funzionato per me - ho una barra di navigazione opaca sopra e questo spento spinge il contenuto sotto di esso.
slycrel,

5
Non funziona quando si utilizza personalizzato collectionview. (Quando la vista da tavolo è dentro collectionviewcell)
Akshit Zaveri,

5
Non ha funzionato per me; L'unica cosa che ha funzionato è stata passare a Plain invece di Grouped
shim

28
Ho avuto questo problema con un TableViewController all'interno di una vista contenitore. Ho dovuto impostare questa proprietà non direttamente sul TableViewController che era incorporato, ma sul controller della vista che conteneva la vista del contenitore. Quindi ha funzionato.
Andy Mortimer,

326

Ci ho giocato un po 'di più e sembra che questo sia un effetto collaterale dell'impostazione di TableView tableHeaderView = nil.

Poiché il mio tableView ha un aspetto dinamico tableHeaderView, quando devo nascondere tableHeaderView, invece di farlo self.tableView.tableHeaderView = nil;, faccio:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

Mi piace questa soluzione meglio che impostare un po 'arbitrario contentInset.topperché uso anche contentInset.topdinamicamente. Dover ricordare di rimuovere un extra di 35 px ogni volta che ricalcolo contentInset.topè noioso.


4
Ottima soluzione! In effetti, è necessario impostarlo su 0,01f per eliminare la vista dell'intestazione della vista tabella predefinita come nel codice.
Simone Manganelli,

2
A proposito, questo è anche possibile fare con un drag & drop in Interface Builder. Comunque grazie! :)
Rudolf Adamkovič,

8
si merita una medaglia per questo
Vaibhav Gautam,

7
Tieni presente che una vista in altezza 0,01f nella parte superiore della vista della tabella significa che tutte le celle al di sotto sono disallineate (la prima cella ha un'origine Y di 0,01, la successiva di cell_height + 0,01, ecc.), Quindi il contenuto di tali celle sarà disallineato. (Attiva Debug > Color Misaligned Imagesil simulatore per vederlo da solo.) Non vuoi farlo.
Simon Whitaker,

2
È meglio usare al UITableViewHeaderFooterViewposto di UIView. E CGFLOAT_MINfunziona allo stesso modo, 0.01fma meglio in teoria.
Jaybo,

178

Per IOS 7 se si sta allocando una vista tabella in un controller vista che è possibile esaminare

self.edgesForExtendedLayout = UIRectEdgeNone;

il tuo problema sembrava simile al mio

Aggiornare:

Swift in iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
Ha funzionato nella mia pianura UITableView. Il problema deriva dal fatto che il mio UITableViewera UIViewControllerall'interno di un UINavigationControllerelemento che causava il calo del contenuto del tavolo di 44 punti, quindi il contenuto iniziale non era dietro navBar. Ciò non era necessario con il mio layout, quindi ha causato problemi. Alla fine ho cambiato il mio codice con il automaticallyAdjustsScrollViewInsetsquale ha funzionato anche.
DBD,

Questa proprietà viene applicata solo per visualizzare i controller incorporati in un contenitore come UINavigationController. Il controller della vista radice della finestra non reagisce a questa proprietà. Il valore predefinito di questa proprietà è tutto. .. Sento che il valore predefinito dovrebbe essere 0? Dove ha questo vantaggio.
Desh_

5
Più elegante con Swift 3:edgesForExtendedLayout = []
Dave Batton

Ciao @yeahdixon Quale software usi per creare la freccia rosa? grazie in anticipo
iArezki il

175

Prova a cambiare la contentInsetproprietà da cui UITableVieweredita UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

È una soluzione alternativa, ma funziona


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);ha funzionato meglio per me perché c'erano 20 pixel extra in alto e in basso.
Brian,

1
Sebbene questa soluzione "forza bruta" funzioni, penso che quelle in basso (in particolare gli inserti di regolazione automatica) dovrebbero essere classificate più in alto.
eladleb,

134
self.automaticallyAdjustsScrollViewInsets = NO;

prova, puoi farcela!


Funziona benissimo per nascondere tableHeaderView in iOS 7.0, ma non è supportato nelle versioni precedenti.
Brian,

Funziona benissimo con iOS 7.
StackRunner

3
Importante: assicurati di farlo nel controller della vista contenitore, se UITableView è posizionato su un controller che viene quindi incorporato in un altro controller, fallo nel controller superiore dell'incorporamento, non direttamente quello in cui hai inserito UITableView (dove AutoLayout prenditi cura delle cose).
James Stone,

Questo è meglio di uncheck Adjust scroll view insets. Perché a volte non utilizziamo lo storyboard per creare la nostra interfaccia utente.
JW.ZG,

Questo funziona per me. Ho allegato la vista alla barra di navigazione e alla vista tabella, non accade in iOS 11, ma si verifica in iOS 10. Grazie.
Dobiho,

78

È possibile rilevare se l'app esegue iOS7 o versione successiva e aggiungere questi due metodi nel delegato della vista tabella (in genere nel codice UIViewController)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Questa forse non è una soluzione elegante ma funziona per me

Versione rapida:

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

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

1
Questo ha funzionato per me. UITableView aggiunge spazio per molte ragioni diverse. In particolare, correlato a OP, il problema si verifica solo per la vista tabella stile raggruppata. E questa soluzione ha risolto il problema.
RajV,

5
Puoi usare CGFLOAT_MIN invece di 0.001 ti dà il valore assoluto più piccolo di CGFloat.
eiKatte,

2
Questa è la risposta corretta poiché la vera caratteristica è che il riempimento è presente solo nella vista tabella stile raggruppata e viene ignorato se si specifica l'intestazione / piè di pagina
Jakub Truhlář,

Questo dovrebbe essere contrassegnato come la risposta corretta. Un metodo delegato per eseguire l'override e risponde alla domanda. Almeno provalo prima se leggi in fondo a tutti gli hack. Prova a twittare: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: sezione (NSInteger) {// return CGFLOAT_MIN; ritorno 30.0f; }
Matthew Ferguson,

Bello! Come bonus, se vuoi un po 'di intestazione in alto e altro tra le sezioni raggruppate, puoi usare quanto segue:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders

55

Ho trovato la causa del mio bug originale e ho creato un progetto di esempio che lo mostra. Credo che ci sia un bug iOS7.

A partire da iOS7, se crei un UITableView con lo stile Raggruppato, ma non hai un delegato impostato sul primo layout, allora imposti un delegato e chiami reloadData, nella parte superiore ci sarà uno spazio di 35px che non andrà mai via.

Guarda questo progetto che ho realizzato mostrando il bug: https://github.com/esilverberg/TableViewDelayedDelegateBug

In particolare questo file: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Se la linea 24 è attiva,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

ci sarà uno spazio extra di 35 px nella parte superiore. Se la riga 27 è attiva e 24 è commentato,

self.tableView.delegate = self;

nessuno spazio in alto. È come se tableView stia memorizzando nella cache un risultato da qualche parte e non si ridisegna da solo dopo che il delegato è stato impostato e viene chiamato reloadData.


21
Aggiungo che anche se c'è un delegato ma quello del delegato tableView:heightForHeaderInSection:e tableView:heightForFooterInSection:restituisce 0, avrai anche questo problema. L'implementazione dei metodi di protocollo sopra E la restituzione di 0.01f lo hanno risolto per me.
John Estropia,

1
SÌ!! Ho provato 3 cosiddette soluzioni, e questa era quella! Fantastico, grazie: D
Henrik Erlandsson l'

Perfetto. Qualcuno ha segnalato un bug perché penso che questo non sia il comportamento previsto.
Pushparaj,

grande scoperta! Questo sta ancora accadendo in iOS 9 (non stiamo usando XIB) ma l'impostazione del delegato su init ha corretto la spaziatura (non in loadView o viewDIdLoad). Grazie!
John Stricker,

1
L'impostazione stimata L'altezza per l'intestazione mi ha aiutato
Viktor

49

Deseleziona "Regola scorrimento Visualizza inserti"

inserisci qui la descrizione dell'immagine


Avevo bisogno di questa opzione per un altro mio controller di visualizzazione, e apparentemente quando ho fatto un nuovo VC, la modifica è stata portata avanti. Grazie per questo!
David

Si! Funziona, basta impostarlo in ContainerView e funziona!
Felipe FMMobile

46

Un altro breve commento ... anche in XCode 6.1, c'è un bug con spazi verticali che appaiono nella parte superiore di UIScrollViews, UITextViewse UITableViews.

inserisci qui la descrizione dell'immagine

A volte, l'unico modo per risolvere questo problema è accedere allo Storyboard e trascinare il controllo del problema in modo che non sia più la prima visualizzazione secondaria della pagina.

inserisci qui la descrizione dell'immagine

(I miei ringraziamenti a Oded per avermi indicato in questa direzione ... Sto pubblicando questo commento, solo per aggiungere alcuni screenshot, per dimostrare i sintomi e correggere.)


1
Nota che questo bug, errrr, si verifica anche in iOS 8 se hai un UITextView come primo sottocontrollo sulla tua pagina ... quindi non è solo un problema di UITableView.
Mike Gledhill,

1
Di tutte le soluzioni solo questo hack ha funzionato per me. Una strana correzione di un bug strano. Ho affrontato questo problema con UITableview.
Mesbah,

4
1 milione di grazie! Questa è l'unica soluzione che ha funzionato per me.
user139816,

1
(Sono stupito dopo 18 mesi, e i lettori stanno ancora votando questa risposta. Apple non ha ancora seriamente risolto il problema?!)
Mike Gledhill

1
salvato la mia vita! Grazie. sai quanto tempo ci è voluto per trovare questa semplice piccola "correzione"? grrh.
Mc.Stever

40

Secondo questa guida alla transizione per iOS7 di Apple, le impostazioni del contenuto della vista di scorrimento vengono regolate automaticamente. Il valore predefinito di automaticAdjustsScrollViewInsets è impostato su YES.

UIViewController che ha UITableView dovrebbe impostare questa proprietà su NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Questo farà il trucco.

MODIFICA 1:

Inoltre, si potrebbe provare:

self.navigationController.navigationBar.translucent = YES;

Questo rimuove anche l'imbottitura aggiuntiva nella parte superiore.


Ottima risposta, a meno che non risponda esattamente alla domanda. Esilver parla di 35px gap, ma iOS7 aggiunge un'intestazione extra di 20px: uguale all'altezza della barra di stato.
Martin,

Problema ridicolo. Grazie per la risposta.
Genki,

Questa è la risposta a un problema diverso.
entonio

Grazie, ha funzionato per me, nel mio caso specifico avevo un controller da tavolo incorporato nel viewcontroller e impostando automaticamente AdjustsScrollViewInsets = false nel viewcontroller il gap superiore è scomparso
Alexey

39

Durante l'utilizzo di TableView raggruppato, utilizzarlo per evitare il taglio dei bordi in viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

Ho provato tutti gli altri. Questo è quello che ha funzionato! Grazie
Michael,

36

Molte delle risposte precedenti sopra sono troppo confuse. Si romperanno in qualsiasi momento in futuro se Apple decidesse di risolvere questo comportamento imprevisto.

Radice del problema:

  1. a UITableViewnon piace avere un'intestazione con un'altezza di 0,0. Se quello che stai cercando di fare è avere un'intestazione con un'altezza di 0, puoi saltare alla soluzione.

  2. anche se in seguito assegni un'altezza non 0,0 alla tua intestazione, a UITableViewnon piace inizialmente assegnare un'intestazione con un'altezza di 0,0.

Soluzione:

Quindi, la soluzione più semplice e affidabile è garantire che l'altezza dell'intestazione non sia 0 quando la si assegna alla vista della tabella.

Qualcosa del genere funzionerebbe:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Qualcosa del genere porterebbe al problema ad un certo punto (in genere, dopo uno scorrimento):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

Alla fine ho trovato la risposta che funziona. Grazie. Inoltre, ho imparato che in tableView.tableHeaderViewrealtà è una vista accessoria sopra il contenuto della riga. Ero confuso con le intestazioni di sezione fino a quando la tua risposta non è venuta fuori.
Joe Huang

1
CGFLOAT_MINè stato sostituito con CGFloat.leastNormalMagnitudeSwift 3
Clay Ellis il

29

storyboard:

Deseleziona semplicemente: Adjust Scroll View Insetsnelle opzioni di Visualizza controller

inserisci qui la descrizione dell'immagine

Codice:

self.automaticallyAdjustsScrollViewInsets = false

2
usando xcode 7 Non vedo Inspector Attribute> Layout, dove dovrei aggiungere self.automaticallyAdjustsScrollViewInsets = false
alex

in vista ha caricato.
CW0007007,

23

Questa è la soluzione per iOS 10 con Swift 3:

È possibile eliminare le imbottiture superiori e inferiori implementando i seguenti metodi dal UITableViewDelegate.

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

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

La seconda pagina su SO mi ha aiutato .... Non so perché, forse a causa di AutomaticDimension, forse a causa dei vincoli con il VFL, comunque, grazie! ozi bua ist brav! : D
Pentarex,

Queste sono le intestazioni e i piè di pagina della sezione . La domanda riguarda l'intera intestazione della tabella. Inoltre, non c'è nulla di specifico su Swift3 o iOS 10 in nessuno dei due metodi delegati (sono presenti da sempre).
Nicolas Miari,

14

Nel mio caso questo è stato ciò che mi ha aiutato. Sto supportando anche iOS6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Non sono sicuro di cosa faccia ma ha funzionato perfettamente. Potresti dare qualche spiegazione?
Matt Wolfe,

@MattWolfe Mi ero perso e ho trovato questa soluzione, non sono sicuro del perché questo stia accadendo. La mia ipotesi è che il controller stia decidendo che tableview ha bisogno di un inserto, a causa della barra di stato (o in altri casi barra degli strumenti / tabbar), quindi la aggiunge automaticamente. Sono davvero alle prese con alcune delle nuove "caratteristiche" di iOS7. Forse qualcuno lo capisce e ha una vera spiegazione al riguardo?
Lukas,

Ho passato gli ultimi 2 giorni a trasferire un'app relativamente piccola su iOS 7 e ho ancora problemi minori .. L'ho risolto in iOS 7 si rompe in 6 e viceversa .. Mi sta facendo impazzire!
Matt Wolfe,

Questo è un problema diverso rispetto a OP. Anche con questo, per la vista raggruppata della tabella, uno spazio extra viene aggiunto in alto.
RajV,

1
questa sembra essere la linea chiave: self.automaticallyAdjustsScrollViewInsets = NO; solo l'impostazione che ha rimosso lo spazio extra che avevo.
Mike M,

14

Aggiungi semplicemente quanto segue a viewDidLoad nel tuo VC:

self.automaticallyAdjustsScrollViewInsets = NO;

Questa correzione ha funzionato e preferisco impostare manualmente gli inserti usando numeri magici. Grazie!
imobilizer,

14

Quindi stavo provando tutti i metodi qui, e questa volta nessuno di loro ha aiutato. Il mio caso era una vista di tabella raggruppata su iOS 9. Non so davvero perché e come ho scoperto questo, ma per me, impostare il tableViewHeadercon un UIViewcon almeno l' 0.01altezza ha funzionato. CGRectZeronon ha aiutato, niente ha davvero aiutato:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

Swift: iOS avevo una vista da tavolo sulla vista di scorrimento .. quando facevo clic su "Indietro" nella stessa schermata. La vista di scorrimento occupa più spazio in alto .. per risolvere questo ho usato:

 self.automaticallyAdjustsScrollViewInsets = false

Un valore booleano che indica se il controller della vista deve regolare automaticamente i suoi inserti della vista di scorrimento. Il valore predefinito è true, che consente al controller della vista di adattare i propri inserti della vista di scorrimento in risposta alle aree dello schermo consumate dalla barra di stato, barra di navigazione e barra degli strumenti o barra delle schede. Impostare su falso se si desidera gestire autonomamente le regolazioni dell'inserzione della vista di scorrimento, ad esempio quando esiste più di una vista di scorrimento nella gerarchia della vista.


10

Grazie alla risposta di @Aurelien Porte. Ecco la mia soluzione

Causa di questo problema: -

  1. a UITableView non piace avere un'intestazione con un'altezza di 0,0. Se quello che stai cercando di fare è avere un'intestazione con un'altezza di 0, puoi saltare alla soluzione.
  2. anche se in seguito assegni un'altezza non 0,0 alla tua intestazione, a UITableView non piace assegnare inizialmente un'intestazione con un'altezza di 0,0.

In ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

Non c'è bisogno di qualcosa del genere: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

In heightForHeaderInSectiondelegato: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

In viewForHeaderInSectiondelegato: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

10

Ecco come può essere risolto facilmente in iOS 11 e Xcode 9.1 tramite Storyboard:

Seleziona Visualizza tabella> Impostazioni dimensioni> Inserimenti contenuti: Mai


1
Ha funzionato per me :)
bhupinder

Grande! Grazie :)
Saeed Ir

1
Questo è invece di automaticallyAdjustsScrollViewInsets
iOS

9

Suppongo che sia solo una parte del nuovo UITableViewStyleGrouped stile. È presente in tutte le viste di tabella raggruppate e non sembra esserci alcun modo diretto per controllare quello spazio.

Se quello spazio è rappresentato da a UIView, sarebbe possibile cercare tra tutti subviewsi fileUITableView per trovare quella vista specifica e modificarlo direttamente. Tuttavia, c'è anche la possibilità che quello spazio sia solo un offset hardcoded prima che le intestazioni e le celle inizino e non ci sarà modo di modificarlo.

Per cercare in tutte le sottoview (eseguirò questo codice quando la tabella non ha celle, per rendere un po 'più semplice la lettura dell'output):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

3
Se UITableViews (per essere più specifici UITableViewCellScrollView) su iOS7 ci ha insegnato una cosa, è lasciare la gerarchia di vista delle classi integrate da sole.
Matthias Bauch,

Buon punto. L'altra opzione è ... continuare a hackerare per ogni iOS;)
Dan Rosenstark,

Whoops, sì. Volevo scrivere quell'avvertimento ma ho dimenticato.
Kevin,

Kevin - Penso che tu abbia ragione, questo è di progettazione. Sembra che restituire 0 per heightForHeaderInSection sia il modo più semplice per rimuovere questa imbottitura. Per qualche motivo in quel particolare caso non funzionava per me, ma funziona su altri UITableViews.
esilver

1
È decisamente "progettato". Se hai messo in pausa l'esecuzione ed eseguito: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]vedrai che l'intestazione della tabella, o l'intestazione della prima sezione, o la prima cella (a seconda di ciò che usi) lascia naturalmente un bordo di 35px .... boo.
Mr. T

9

La mia risposta sarà una risposta più generale, ma può essere applicata anche su questo.

Se la vista radice (di ViewController ) o il primo figlio (vista secondaria) della vista radice è una sottoclasse di UIScrollView (o UIScrollView stesso), e se

self.navigationController.navigationBar.translucent = YES;

framework imposterà automaticamente contentInset pre-calcolato .


Per evitarlo puoi farlo

self.automaticallyAdjustsScrollViewInsets = NO;

ma nel mio caso non sono stato in grado di farlo, perché stavo implementando SDK che ha il componente UIView che può essere utilizzato da altri sviluppatori. Quel componente UIView contiene UIWebView (che ha UIScrollView come prima vista secondaria). Se quel componente viene aggiunto come primo figlio nella gerarchia della vista di UIViewController, gli inserimenti automatici verranno applicati dal sistema.

Ho risolto questo problema aggiungendo una vista fittizia con frame (0,0,0,0) prima di aggiungere UIWebView.

In questo caso il sistema non ha trovato la sottoclasse di UIScrollView come prima sottoview e non ha applicato gli inserti


livesaver! grazieself.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

Questo codice ha funzionato per me, la migliore risposta per me che è stata scritta in objective-Calto quindi l'ho convertita in Swift.

Per Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

Basta scrivere questo viewDidLoad()e funzionerà come un fascino.


1
grazie mille, ha funzionato bene per me.
Ângelo Polotto

1
il tuo benvenuto buon codice
Vipul Kumar

7

Ho avuto la stessa correzione di arielyz. Una volta spostato UITableView in modo che non fosse la prima sottoview della vista padre, è andato via. Il mio spazio era di 20 px, non di 35.

Non sono stato in grado di ricrearlo in uno xib ritratto, solo uno xib orizzontale. In seguito presenterò un bug radar se riesco a riprodurlo in una semplice app demo.


Si è imbattuto nello stesso problema, non è stato in grado di risolverlo modificando il contenutoInset ma questo metodo ha funzionato, anche se è piuttosto confuso. Per quello che vale, usando lo strumento di debug visivo, sono stato in grado di vedere che mentre UITableView aveva la giusta altezza, UITableViewWrapper al suo interno no.
Mic Fok,

Perfetto. Ciò ha risolto il bug per me, in XCode 6.1. Nessuno degli altri suggerimenti in questa pagina StackOverflow ha fatto alcuna differenza. Avevo un UITableView all'interno di un UIView, ed era la prima sottoview. Trascinandolo per diventare il secondo sottoview, è stato risolto perfettamente. (Se qualcuno ha bisogno di me, sarò nel pub.)
Mike Gledhill il

Grazie! Questo funziona anche se si dispone di un controller di visualizzazione tabella all'interno di un contenitore. Spostando il contenitore in modo che non sia il primo nella vista padre, si rimuove lo spazio nella parte superiore della vista tabella.
Strangeluck,

7

Penso che rendere UIEdgeInsets -35 0 0 0 sia noioso. Nel mio caso, ho implementato tableView: heightForHeaderInSection: method e ha il potenziale per restituire 0.

Quando ho cambiato da 0 a 0.1f, il problema è scomparso.


1
Se potessi, lo voterei più di una volta. Deve essere uno strano errore tecnico o qualcosa del genere ... Come qualsiasi cosa> 0 funziona, suggerisco invece di utilizzare 0,1 FLT_EPSILON o DBL_EPSILON, visto che entrambi rappresentano il valore positivo dei piccoli in modo tale che 1,0 + epsilon! = 1.0
Henri Normak

7

L'unica cosa che ha funzionato per me è stata:

Veloce :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Obiettivo-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

Inoltre, avevo ancora uno spazio extra per la prima sezione. Questo perché stavo usando la tableHeaderViewproprietà in modo errato. Risolto anche quello aggiungendo:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))

Funziona per me per Swift 4.2. Grazie
Sylar,

Ho provato tutto in questa pagina, per iOS13 raggruppata vista tabella con vista intestazione. self.tableView.tableHeaderView = UIView (frame: CGRect (x: 0, y: 0, larghezza: tableView.frame.size.width, altezza: 0.01)). risolto il problema.
Ning,

7

Codice Swift 4: per tableview senza intestazioni di sezione puoi aggiungere questo codice:

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

e otterrai la spaziatura dell'intestazione su 0.

Se vuoi un'intestazione della tua altezza specifica, passa quel valore:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

e la vista dal delegato viewForHeaderinSection.


Questo non risponde alla domanda. La domanda era da dove viene la spaziatura extra, non come liberarsene.
Stephen Newell,

la cosa strana è che se si restituisce 0 in heightForHeaderInsection si ottiene ancora questo spazio extra. Funziona perfettamente con CGFloat.leastNormalMagnitude (numero meno positivo)
ShadeToD

7

Per essere precisi, per rimuovere lo spazio tableviewHeader dall'alto ho apportato queste modifiche:

YouStoryboard.storyboard> YouViewController> Seleziona TableView> Finestra di ispezione Dimensioni> Inserimenti contenuto - Impostalo su mai.

inserisci qui la descrizione dell'immagine


Quali sono le informazioni aggiuntive oltre allo screenshot rispetto a questa risposta ?
Artjom B.

è lo stesso immagino, non ho trovato quella risposta mentre cercavo una soluzione. Devo cancellare la mia risposta allora ...?
user832

Non se puoi espandere un po 'la tua risposta descrivendo il motivo per cui Content insets = In realtà non risolve mai questo problema (come funziona questa opzione?).
Artjom B.

Quando l'inserzione del contenuto è impostata su Mai, tableView non scorrerà verso l'alto durante la modifica di textField.
mojtaba al moussawi,

6

usa questo penso che questo aiuto ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
Brillante! Funziona come un fascino in iOS 9.2. Questa risposta è perfetta poiché in alcuni casi ho bisogno di sopprimere la prima intestazione mentre in altri lo mostrano. Ho visto un'altra risposta usando CGFloat.min, che funziona anche. Quindi il mio viewController ora può fornire un numero reale come 44.0 o essenzialmente 0.
David H

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

automaticamenteAdjustsScrollViewInsets = falso lavoro da parte mia! Grazie!
Daniel Kuta,
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.