UITableView inizia con un offset in iOS 7


115

Ho trascinato un UITableView normale su un UIViewController in iOS 7.

Ora c'è un offset verticale dello spazio prima che inizi la prima cella. Come me ne sbarazzo? Voglio che la prima riga sia molto più vicina al bordo superiore di dove inizia effettivamente UITableView. Non ho chiesto l'offset grande vero?

inserisci qui la descrizione dell'immagine

Qualche idea?


43
Sono stato aiutato da quanto segue: YouStoryboard.storyboard> YouViewController> Attributes inspector> Deseleziona - Regola i riquadri della visualizzazione di scorrimento.
Alexander

17
btw, puoi fare uno screenshot del simulatore iOS usando il tasto Comando + S
Hemang

@Alexander: anche io sono stato aiutato con i tuoi suggerimenti, tuttavia deselezionando ExtendEdges.UnderTopBars è apparso di nuovo lo spazio di offset verticale. Non sono sicuro che sia uno dei (tanti?) Bug in Xcode6, ma questi problemi mi danno qualche mal di testa una volta ogni tanto!
iOS-Coder

Risposte:


81

Per impostazione predefinita, i controller della vista tabella riempiranno il contenuto sotto la barra di navigazione in modo da poter scorrere il contenuto sotto di esso e vederlo, in uno stato sfocato, sotto la barra di navigazione / barra degli strumenti.

Sembra che tu lo stia posizionando a 44 (forse 64) px per spostarlo fuori da sotto la barra di navigazione, ma già compensa questo in modo da ottenere un grande divario.

Vai allo storyboard / xib in IB e deseleziona il contenuto dello spettacolo sotto la barra di navigazione.


6
Scusa, come è irrilevante il commento sull'accordo di non divulgazione su iOS7? Questo è un forum per aiutare le persone.
Cocoadelica

In Xcode versione 5.1 su Viewcontroller deseleziona i bordi estesi> Sotto le barre superiori per rimuovere il riquadro del contenuto UITableView superiore
Emel Elias

3
Allora, dov'è il contenuto dello spettacolo sotto la barra di navigazione thigo? Non riesco a trovarlo.
Anup Kattel

10
@FrankGorman in Xcode 5.1.1 c'è un'opzione nello storyboard per un controller di visualizzazione specifico è Adjust Scroll View insets, rimuovere il segno di spunta.
korat prashant

1
hey @koratprashant. commento molto utile.
KDeogharkar

107

La nuova implementazione iOS 7 di UIViewController ha un nuovo set di opzioni che consente allo sviluppatore di scegliere se il sistema aggiungerà automaticamente inserti per UIScrollView , UITableView e derivazioni.

Per disabilitare questo comportamento, deseleziona queste caselle per tutti gli UIViewController desiderati in InterfaceBuilder, sull'ispettore oggetto selezionato di UIViewController :

Visualizza Controller Inspector

Per ulteriori dettagli:

  1. Invia le tue app iOS 7 oggi.
  2. Guida alla transizione dell'interfaccia utente di iOS 7> Aspetto e comportamento

Grazie! Mi hai salvato.
rsc

68

Dalla guida alla transizione di iOS7:

Se non si desidera che i riquadri del contenuto di una visualizzazione a scorrimento vengano regolati automaticamente, impostare automaticamenteAdjustsScrollViewInsets su NO. (Il valore predefinito di automaticAdjustsScrollViewInsets è YES.)

   self.automaticallyAdjustsScrollViewInsets = NO;

9
Questo può anche essere impostato in XCode nell'ispettore degli attributi. Deseleziona la Adjust Scroll View Insetscasella di controllo per il layout del controller di visualizzazione.
Andrew

1
Se carichi l'UIViewController in modo programmatico (senza usare un XIB), questo funziona a meraviglia. ImpostatoautomaticallyAdjustsScrollViewInsets = NO nel controller della vista.
KabraBoja

Questo è stato per me. Confuso perché il mio TableView era all'interno di una visualizzazione contenitore e inizialmente sembrava a posto. Ma si è incasinato quando sono tornato da un altro controller di visualizzazione.
n13

Grande! Risparmia un sacco di tempo!
inix

34

ho avuto un problema simile, dopo aver chiuso un viewController, il contentOffset dal mio tableView è stato modificato in (0, -64).

la mia soluzione era un po 'strana, ho provato tutte le altre risposte ma non ho avuto successo, l'unica cosa che ha risolto il mio problema era cambiare la posizione tableView nell'albero dei controlli di .xib

era il primo controllo nella vista genitore in questo modo:

prima

Ho spostato il tableView subito dopo ImageView e ha funzionato:

dopo

sembra che mettere la vista tabella nella prima posizione stesse causando il problema, e spostare la vista tabella in un'altra posizione ha risolto il problema.

PD Non sto usando autoLayout né storyboard

spero che questo possa aiutare qualcuno!


Ho notato la stessa cosa! Non inserisco visualizzazioni aggiuntive, ma compenso semplicemente il divario spostando UITableView -44 in alto. In IB sembra che devo spostare -64px, ma in runtime -64px causa la sovrapposizione di tablview sulla barra di navigazione e -44px è OK. Non riesco a spiegarlo del tutto. Ho riscontrato questo problema nella visualizzazione popover dell'iPad, quando non ho notato alcun problema simile nello storyboard dell'iPhone.
Mike Keskinov

Questo problema si pone anche con l'Uiview. se le viste mostrate nell'interfaccia utente non sono nello stesso ordine.
Rinku

2
Oggi ho avuto lo stesso problema, con XCode 6.1. Guadagna altre 2-3 ore sprecate, cercando di aggirare i bug di Apple ...
Mike Gledhill

3
Questo è stato estremamente utile e merita più attenzione! Nessuna quantità di giocherellare con le impostazioni del controller della vista o l'inserimento / offset del contenuto ha aiutato, ma cambiare l'ordine delle visualizzazioni nello storyboard ha risolto il problema per me.
Caleb

1
Apple, voglio dire ... WTF? Grazie amico, anche questo storyboard fisso con layout automatico.
Borzh

30

risolve il mio problema simile:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}

1
Dovresti controllare la versione del sistema in questo modo usa:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes

Questo ha funzionato per me per il problema di spaziatura che stavo avendo, ma ora il mio spinner di controllo pull-to-refresh si presenta parzialmente oscurato e sotto il mio menu principale. Qualcuno ha visto anche questo? Eventuali soluzioni alternative?
Nick

@ nickv2002 prova a creare tableView in modo programmatico
Alex

Ho provato tutte le altre soluzioni ma solo questa ha funzionato per me
DanielR

13

Prova a usarlo

tableView.separatorInset = UIEdgeInsetsZero;

Ovviamente, se stai supportando qualcosa di meno di iOS7, dovrai assicurarti che l'oggetto risponda a questo selettore prima di chiamarlo.


4
non sono sicuro del motivo per cui questo è stato votato ... separatorInset cambia solo le linee di distanza tra le celle sono inserite dal bordo della vista. La domanda riguarda lo spazio sopra e sotto le celle
Rembrandt Q. Einstein

L'immagine è fuorviante, ma una ricerca comune su Google per il problema del margine produce questa pagina.
Will

9

Scherzi a parte, il cambiamento contentOffsetnon è la soluzione. Stai solo correggendo un problema e non risolvendo la causa. Ho dovuto affrontare lo stesso problema e si è scoperto che le tableView raggruppate hanno un'imbottitura in alto. Nel mio caso impostando il tipo su normale ha funzionato.

Si spera che faccia risparmiare a qualcuno qualche minuto. Z.


1
mi mancava totalmente, sono contento di aver trovato la tua risposta, FAVOREVOLE
AamirR

8

Con iOS 9, nessuna delle altre risposte da questa pagina ha funzionato per me (cioè deselezionando le caselle in Storyboard, impostando automaticallyAdjustsScrollViewInsetssuNO ).

La mia soluzione alternativa di cui sono davvero insoddisfatto è stata questa:

- (void)viewDidAppear:(BOOL)animated {
    self.tableView.contentOffset = CGPointMake(0.0, 0.0);
    self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
}

Le stesse righe viewWillAppearo viewDidLoaderano inefficaci.


Questa dovrebbe essere l'unica risposta per uitableviewcontroller iOS 9 .... davvero, nient'altro ha aiutato, e li ho provati tutti, dove l'hai trovato o come l'hai capito? molti 10x
Erez

Deselezionare la Adjust Scroll View insetscasella di controllo funziona per iOS 9.
Adam

Regolare gli inserti della visualizzazione a scorrimento non funziona per me qualsiasi altra soluzione?
Yogesh Patel

5

A volte, ottengo un 64divario in altezza nella parte superiore della mia vista tabella quando UIViewControllerè incorporato in un controller di navigazione.

inserisci qui la descrizione dell'immagine

In passato, avrei semplicemente ricreato tutto, sperando che i vincoli risultassero corretti dopo una tabula rasa.

TIL: Se non vuoi creare un vincolo verticale a Top Layout Guide, puoi tenere premuto il Optiontasto per accedere al Container Margin.

inserisci qui la descrizione dell'immagine

Quindi assicurati che la Top Space to Superviewcostante sia impostata su 0. Questo ha funzionato almeno per me.

inserisci qui la descrizione dell'immagine


1,5 anni dopo, ma questo ha risolto la mia serata. Grazie!
asp_net

4

Questo funziona per me:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}

2

Se aggiungi una UIView vuota prima di UITableView (o qualsiasi vista è scorrevole come ScrollView e TextView), puoi avere fortuna.


1

Avevo un UITableViewController incorporato in una visualizzazione contenitore. Per sbarazzarsi dei 64 punti indesiderati di spazio verticale, avevo bisogno di deselezionare "Regola gli inserti della visualizzazione di scorrimento" in Interface Builder e impostare il contentInset di UITableView nella viewWillAppear del mio UITableViewController come di seguito.

La dimensione dello spazio verticale sembra corrispondere all'altezza del frame della barra di navigazione e all'offset y. Il problema si è verificato solo su iOS 7.

- (void)viewWillAppear:(BOOL)animated;
{
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        const CGRect navBarFrame = self.navigationController.navigationBar.frame;
        const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height;
        self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0);
    }
}

1

In Xamarin iOS, ho riscontrato questo problema su un UITableViewController in background subito dopo la chiusura della finestra di dialogo modale in primo piano. Nel processo di spostamento in primo piano, UITableViewController aveva insets impostati (da qualche parte da iOS):

Questa classe l'ha risolto

public class UITableViewControllerWithBugFix : UITableViewController {
    public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) {
    }

    public override void ViewWillLayoutSubviews() {
        if (TableView.ContentInset.Top != 0.0f)
            TableView.ContentInset = UIEdgeInsets.Zero;
        if (TableView.ScrollIndicatorInsets.Top != 0.0f)
            TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero;

        base.ViewWillLayoutSubviews();
    }
}

1

Di tanto in tanto torno a questa situazione orribile e noto che è ancora abbastanza sconosciuta. Quindi, per la memoria futura ...

Ultimamente, sto risolvendo con questa soluzione alternativa.

  1. Aggiungi una vista secondaria nella parte superiore di UITableView, con altezza zero pixel. Funziona con layout automatico o senza.
  2. Se mi sento fiducioso :-) Rimuovo questa vista falsa, fisso i vincoli in alto e magicamente funziona.

Non chiedermi perché, penso ancora che sia un bug profondo in UIKit.


0

Se vai allo storyboard, puoi modificare l'offset selezionando la tabella e nella sezione Vista tabella nell'ispettore Attributi devi solo cambiare i Riquadri separatori a sinistra su 0.


0

Penso che la vera soluzione sia impostare i vincoli top e bottom nella tableview in modo che siano uguali a topMargin e bottomMargin. Non la guida al layout superiore e la guida al layout inferiore. Ciò consente di mantenere automaticamenteAdjustsScrollViewInsets vero.


0

Soluzione Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}

0

Se è stato incorporato il tuo TableViewController in un navigationController o un ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard. Check constraint to margins when you are doing the constraintsNessun altro modo ha funzionato per me. Non ho potuto commentare, quindi sto solo ripetendo la risposta di Robert Chens.


0

Ho provato molte delle risposte. La modifica delle impostazioni nello storyboard ha causato problemi di increspatura con un menu in sovrimpressione che si apre da sinistra.

Ho solo un UIViewController vuoto nello storyboard, altrimenti tutto viene generato a livello di programmazione.

Ho lo stesso problema con un UITableView all'interno di un UIView all'interno di un UIViewController. Vale a dire, le intestazioni di sezione iniziano troppo in basso quando UIViewController è incorporato in un controller di navigazione. Senza il controller di navigazione tutto funziona correttamente.

Per risolvere il problema ho creato una UILabel e con i vincoli ho posizionato il vincolo inferiore UILabel = il vincolo superiore di UIView (quindi non viene mostrato sullo schermo. Ora con quel controllo aggiuntivo (la nuova etichetta) il TableView si comporta correttamente.

    inputsContainerView.addSubview(titleLabel)
    inputsContainerView.addSubview(tableView)

    // inputsContainerView
    ///////////////////////////////////////
    inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true
    inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true
    inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true

    // tableView
    ///////////////////////////////////////
    tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true

    // titleLabel - inserted to stop bad section header behavior
    ///////////////////////////////////////
    titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true
    titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true
    titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true

0

Ho avuto lo stesso problema in iOS 11 e xib, UITableviewController e l'ho risolto come di seguito

[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
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.