iOS 7: UITableView viene visualizzato nella barra di stato


219

La prima schermata della mia applicazione è una UITableViewControllersenza barra di navigazione, il che significa che il contenuto scorre sotto la barra di stato, quindi ci sono molte collisioni di testo. Ho modificato entrambe le proprietà per Under top barse Adjust scroll view insetsche in realtà impediscono lo scorrimento sotto, ma a costo di mantenere la vista superiore della tabella sotto. Ho tentato di impostare un UITableViewframe di offset di 20 pixel, ma non sembra avere effetto e poiché al momento ho bisogno dell'app per essere compatibile con iOS 6, non posso passare a Storyboard iOS 7 per forzare l'utilizzo del layout automatico la guida di altezza superiore. Qualcuno ha trovato una soluzione che funziona per entrambe le versioni?

Cose che ho provato: impostazione edgesForExtendedLayout, modifica delle impostazioni in Storyboard per Under top barse Adjust scroll view, forzando la cornice in una nuova area.

Un'immagine vale più di mille parole: Flusso della barra di stato sotto


2
Una rapida soluzione potrebbe essere quella di aggiungere un'intestazione vuota di 20 pixel alla tabella quando si esegue su iOS 7.
EricS

@EricS: ho già UITableViewun'intestazione, scorre anche sotto la barra di stato.
Nicholas Smith,

Perché non utilizzare la guida al layout automatico su iOS 6? Funziona.
Steven Fisher,

Risposte:


366

Per chiunque sia interessato a replicare questo, basta seguire questi passaggi:

  1. Crea un nuovo progetto iOS
  2. Apri lo storyboard principale ed elimina l'impostazione predefinita / iniziale UIViewController
  3. Trascinane uno nuovo UITableViewControllerdalla Libreria oggetti
  4. Impostalo come controller della vista iniziale
  5. Alimenta la tabella con alcuni dati di test

Se segui i passaggi precedenti, quando esegui l'app, vedrai che nulla, inclusa la modifica delle caselle di controllo di Xcode su "Estendi bordi sotto {Barre superiori, inferiori, opache}" funziona per impedire che la prima riga appaia sotto la barra di stato, né puoi affrontarlo a livello di codice.

Ad esempio, nello scenario sopra riportato, i seguenti non avranno alcun effetto:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

Questo problema può essere molto frustrante, e credo che sia un bug da parte di Apple, soprattutto perché si presenta nel proprio pre-cablato UITableViewControllerdalla libreria di oggetti.

Non sono d'accordo con tutti coloro che stanno cercando di risolverlo utilizzando qualsiasi forma di "numeri magici", ad esempio "usa un delta di 20px". Questo tipo di programmazione strettamente accoppiata non è sicuramente ciò che Apple vuole che facciamo qui.

Ho scoperto due soluzioni a questo problema:

  • Preservare la UITableViewControllerscena :
    se desideri conservare il file UITableViewControllernello storyboard, senza posizionarlo manualmente in un'altra vista, puoi incorporarlo UITableViewControllerin UINavigationController(Editor> Incorpora in> Controller di navigazione) e deselezionare "Mostra barra di navigazione" nella finestra di ispezione . Questo risolve il problema senza ulteriori modifiche e preserva anche la tua UITableViewControllerscena nello storyboard.

  • Utilizzando AutoLayout e incorporando il UITableViewin un'altra vista (credo che sia così che Apple vuole che lo facciamo) :
    crea uno spazio vuoto UIViewControllere trascina il tuo UITableViewal suo interno. Quindi, trascinare tenendo premuto il tasto Ctrl dalla UITableViewbarra verso lo stato. Man mano che il mouse arriva in fondo alla barra di stato, vedrai un fumetto di Autolayout che dice "Guida al layout superiore". Rilascia il mouse e scegli "Spaziatura verticale". Ciò dirà al sistema di layout di posizionarlo proprio sotto la barra di stato.

Ho testato entrambi i modi su un'applicazione vuota ed entrambi funzionano. Potrebbe essere necessario apportare ulteriori modifiche per farli funzionare per il tuo progetto.


5
Cordiali saluti, l'opzione 1 (incorporamento in un controller di navigazione) fa sì che le celle siano visibili dietro la barra di stato traslucida quando si scorre la tabella.
RyanR,

4
@RyanR L'ho notato anch'io, ma penso che a un certo punto sia OK. Apple ha fatto la stessa cosa nella vista delle schede aperte di Safari per dispositivi mobili, le schede verranno visualizzate sotto la barra di stato. La soluzione del controller di navigazione è la soluzione più semplice, faccio il root per essa. Tuttavia, la barra di stato traslucida è un'idea stupida.
Pride Chung,

6
Quando eseguo il controllo-trascinamento dalla vista tabella verso l'alto, non corro mai nella barra di stato. Non c'è barra di stato visibile nella vista, non so cosa intendi qui ...
Jesse,

4
L'opzione 2 non funziona più in Xcode 5. L'azione descritta (ctrl-trascinamento) non avrebbe mai dovuto funzionare, dal momento che è di proprietà del sistema Outlets, ma anche se si trascina manualmente sull'albero della scena a sinistra, la guida di layout superiore NON FUNZIONA (dovrebbe bastare, AFAICT - Credo che questo sia l'ennesimo bug importante in AutoLayout :( :()
Adam

3
@PrideChung sembra stupido quando si utilizza un'intestazione con la vista tabella, l'intestazione rimane fissa nella parte superiore e gli elementi scompaiono dietro - e si ricompongono dietro la barra di stato trasparente ...
Ixx,

86

Se stai facendo cose programmaticamente e stai usando a UITableViewControllersenza una UINavigationControllerscommessa migliore è fare quanto segue in viewDidLoad:

Swift 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

Prima Swift

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

Il UITableViewControllersarà ancora scorrere dietro la barra di stato, ma non sarà sotto di essa quando scorrere verso l'alto.


1
È possibile aggiungere un controllo per la versione del sistema operativo> 7 e supportare anche i sistemi operativi precedenti (nessun inserto per quelli). In caso contrario, ha funzionato bene per i miei scopi.
SimpsOff

8
Il valore dell'altezza dell'hardcoding non è la migliore idea.
Maciej Kozieł,

3
Sì, usa topLayoutGuideinvece la lunghezza.
lipka,

10
Userei UIApplication.sharedApplication.statusBarFrame.size.heightinvece di 20.
mojuba

In questi giorni è stato aggiornato a UIApplication.shared.statusBarFrame.size.height.
asetniop,

23

Nota: questo ha funzionato per me per la seguente configurazione:

  • Nessuna barra di navigazione nella parte superiore dello schermo (la vista tabella incontra la barra di stato)
  • La vista tabella non è scorrevole

Se i due requisiti di cui sopra non sono soddisfatti, la tua miglia può variare.

Posta originale

Ho creato la mia vista a livello di codice e questo ha funzionato per me:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Sorgente (nella sezione topLayoutGuide in fondo a pag.39).


Interessante ... Sono stato in grado di chiamarlo così nel mio progetto senza alcun problema ... Potrei avere una struttura di layout di vista più semplice di quanto tu abbia fatto comunque. Il tuo suggerimento è corretto, apporterò quel cambiamento nella mia risposta.
Storditore

Mi è capitato di imbattermi nel problema quando ho ruotato la mia app. Se la rotazione fosse disabilitata, probabilmente non avresti problemi.
Jeremy,

Non ho abilitato la rotazione nel mio progetto e ho riscontrato il problema, ma sì, rimane comunque un buon punto.
Storditore

1
Per chiunque stia implementando il proprio controller contenitore, questo è il modo corretto di adattarsi allo stato o alla barra di navigazione che si sovrappone!
Rafael Nobre,

Se si modifica l'origine, ma non l'altezza dei limiti della vista, la parte inferiore dello schermo non verrà ritagliata dal bordo inferiore dello schermo dalla quantità in cui è stata modificata l'origine? (quindi diventa impossibile vedere le ultime righe di pixel)
Tenfour04

20

Aggiungendo alla risposta principale:

dopo che il secondo metodo inizialmente non sembrava funzionare, ho fatto qualche aggiustamento aggiuntivo e ho trovato la soluzione.

TLDR; la seconda soluzione della risposta principale funziona quasi, ma per alcune versioni di xCode ctrl + trascinando su "Guida al layout superiore" e selezionando Spaziatura verticale non fa nulla. Tuttavia, regolando prima le dimensioni della vista tabella e selezionando quindi "Guida dallo spazio superiore alla guida al layout superiore", funziona


  1. Trascina un ViewController vuoto sullo storyboard. Visualizza controller

  2. Trascina un oggetto UITableView nella vista. (Non UITableViewController). Posizionalo al centro usando le guide di layout blu.

Vista tabella Centra l'immagine

  1. Trascina un UITableViewCell in TableView. Questa sarà la tua cella di riutilizzo del prototipo, quindi non dimenticare di impostare l'identificatore di riutilizzo nella scheda Attributi o otterrai un arresto anomalo.

Aggiungi cella vista tabella Riutilizza identificatore

  1. Crea la tua sottoclasse personalizzata di UIViewController e aggiungi i <UITableViewDataSource, UITableViewDelegate>protocolli. Non dimenticare di impostare ViewController dello storyboard su questa classe in Identity Inspector.

  2. Crea un outlet per TableView nel tuo file di implementazione e chiamalo "tableView"

Crea Outlet tableView

  1. Fare clic con il tasto destro del mouse su TableView e trascinare sia l'origine dati che il delegato sul ViewController.

delegato dataSource

Ora per la parte di non tagliare nella barra di stato.

  1. Prendi il bordo superiore della vista tabella e spostalo verso il basso su una delle guide di layout automatico blu tratteggiate che si trovano nella parte superiore

ridimensionamento

  1. Ora è possibile controllare il trascinamento dalla vista tabella verso l'alto e selezionare Spazio superiore alla guida di layout superiore

Guida allo spazio dall'alto verso l'alto

  1. Ti darà un errore sul layout ambiguo di TableView, basta aggiungere i vincoli mancanti e il gioco è fatto.

Aggiungi vincoli mancanti

Ora puoi impostare la visualizzazione della tabella come di consueto e non taglierà la barra di stato!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
passare da <= a> e rimuovere il blocco if vuoto
pfrank

1
Leggere self.topLayoutGuide.lengthda viewDidLayoutSubviewsrovinerà il layout delle viste secondarie.

@OLzh mentre lo fai come descritto, self.tableView non può scorrere.
DawnSong

8

Seleziona UIViewController sullo storyboard un'opzione deseleziona Estendi bordi sotto le barre superiori. Ha funzionato per me. :)


Ahimè, non ha funzionato per me. UITableViewController completamente predefinito si sovrappone ancora alla barra di stato. Non credo che la barra di stato sia considerata come barra superiore. Solo barre di navigazione e barre di tabulazione.
Andrew Duncan,

L'unica soluzione che funziona per me, ty. (Nota che devi "abbreviare" la vista della tabella sotto la barra di stato in IB e aggiornare i vincoli).
Martin Makarsky,

Ha funzionato per me su Xcode 8 con un UITableViewController.
Edouard Barbier,

8

Ecco come scriverlo in "Swift" Un adattamento alla risposta di @ lipka:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

Swift non è permesso qui?
uplearnedu.com

L'unica soluzione che ha funzionato per me, che non mi fa creare un UIVIewController
Shereef Marzouk,

1
Questo è meno che ideale perché mantiene l'inserzione superiore a 20, anche in orizzontale dove non esiste una barra di stato predefinita in ios8
voidref

Questa variazione gestisce bene qualsiasi configurazione per me:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

Per Xcode 7, deselezionare il segno di spunta 'traslucido' per la barra di navigazione ha funzionato per me.

inserisci qui la descrizione dell'immagine


Più semplice, più veloce, più semplice, più sicuro? soluzione. Non so perché questo abbia così pochi voti rispetto a tutto il resto.
Gruntcakes,

3

Questo lo risolverà per un UITableViewController (senza numeri magici). L'unica cosa che non sono riuscito a risolvere è se sei su una telefonata, nel qual caso la parte superiore di tableView è premuta troppo in basso. Se qualcuno sa come risolverlo, faccelo sapere.

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

Non so come sia Kosher, ma ho scoperto che questo schema sposta la vista di ViewController verso il basso e fornisce alla barra di stato un solido background:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

Naturalmente, sostituiscilo redColorcon qualsiasi colore desideri per lo sfondo.

È necessario eseguire separatamente uno degli swizzles per impostare il colore dei caratteri / simboli nella barra di stato. Uso View controller-based status bar appearance = NOe Status bar style = Opaque black stylenel plist, per farlo a livello globale.

Sembra funzionare e sarei interessato a sapere di eventuali bug o problemi con esso.


2

La risposta di chappjc funziona benissimo quando si lavora con XIB.

Ho trovato la soluzione più pulita durante la creazione di TableViewController programmaticamente avvolgendo l'istanza di UITableViewController in un altro UIViewController e impostando i vincoli di conseguenza.

Ecco qui:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

Saluti, Ben


1

Penso che l'approccio all'utilizzo di UITableViewController potrebbe essere un po 'diverso da quello che hai fatto prima. Ha funzionato per me, ma potresti non esserne fan. Quello che ho fatto è avere un controller di visualizzazione con una vista contenitore che punti al mio UItableViewController. In questo modo sono in grado di utilizzare TopLayoutGuide fornito al mio nello storyboard. Aggiungi il vincolo alla vista contenitore e dovresti occuparti di iOS7 e iOS6.


1

Ho finito per usare una vista extra con lo sfondo desiderato, aggiunta dopo TableView e posizionata sotto la barra di stato:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

Non è molto carino, ma è una soluzione piuttosto semplice, se hai bisogno di lavorare con viste senza xib e sia IOS6 che IOS7


1

Ho fatto questo per display Retina / Non Retina come

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

La seguente soluzione funziona abbastanza bene nel codice senza usare costanti magiche e tiene conto della modifica della classe di dimensioni da parte dell'utente, ad esempio tramite rotazioni o app affiancate su iPad:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

Funziona con swift 3 - In viewDidLoad ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

Questo codice: 1. Ottiene l'altezza della barra di stato 2. Fornisce alla vista superiore della tabella un inserto di contenuto uguale all'altezza della barra di stato. 3. Fornisce all'indicatore di scorrimento lo stesso inserto, quindi appare sotto la barra di stato.


1

Per quelli come me che preferiscono non incorporare il loro UITableViewControllerin UIViewControllerquesto provare questo:

Una UITableViewControllersottoclasse personalizzata può aggiungere una vista maschera alla superview del tableView. Aggiungi la maschera su viewDidAppear e rimuovi la maschera su viewWillDisappear.

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

Avevo un UISearchBar nella parte superiore del mio UITableView e il seguente ha funzionato;

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

Condividi e divertiti ...



0

La soluzione di Abrahamchez https://developer.apple.com/library/ios/qa/qa1797/_index.html ha funzionato per me nel modo seguente. Ho avuto un singolo UITableviewcontroller come mio punto di vista iniziale. Avevo provato il codice offset e l'incorporamento in un navcon, ma nessuno dei due aveva risolto la trasparenza della barra di stato.

Aggiungi un Viewcontroller e rendilo la vista iniziale. Questo dovrebbe mostrarti le guide di layout più importanti.

Trascina il vecchio Tableview nella vista nel nuovo controller.

Fai tutto il necessario per aggiornare la tabella nel nuovo controller:

Modificare il vecchio file controller.h di visualizzazione in eredita / sottoclasse da UIViewController anziché UITableViewController.

Aggiungi UITableViewDataSource e UITableViewDelegate al .h del viewcontroller.

Riconnetti tutto ciò che è necessario nello storyboard, come una barra di ricerca.

La cosa importante è configurare i vincoli, come nelle domande e risposte di Apple. Non mi sono preoccupato di inserire una barra degli strumenti. Non sono sicuro della sequenza esatta. Ma un'icona rossa è apparsa sulle Guide del layout, forse quando l'ho costruita. Ho cliccato e ho lasciato che Xcode installasse / ripulisse i vincoli.

Quindi ho fatto clic ovunque fino a quando ho trovato il vincolo Spazio verticale e modificato il suo valore massimo da -20 a 0 e ha funzionato perfettamente.


0

Sto usando un UISplitViewController con un controller di navigazione e un controller di visualizzazione tabella. Questo ha funzionato per me nella vista generale dopo aver provato molte soluzioni qui:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

È simile alla soluzione di Hot Licks ma applica la vista secondaria al navigationController.


Questa è l'unica risposta che ha funzionato per me in iOS 8!
SamB,

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

Ecco uno Swift 2.3. (Xcode 8.0) soluzione. Ho creato una sottoclasse di UITableView.

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

Il contenuto dell'inser dovrebbe essere sempre zero (per impostazione predefinita). Lo sto impostando Zero manualmente. Puoi anche aggiungere un metodo di controllo che effettua il controllo e se è qualcosa di diverso da quello che vuoi che sia, ottieni semplicemente il rettangolo corretto. La modifica si rifletterà solo quando viene disegnata la vista tabella (cosa che non accade spesso).

Non dimenticare di aggiornare TableView nel tuo IB (in TableViewController o solo TableView all'interno di ViewController).


0

Stavo affrontando questo problema in iOS 11 ma il layout era corretto per iOS 8 - 10.3.3. Nel mio caso ho impostato un vincolo di spazio verticale su Superview.Top Margin anziché su Superview.Top che funziona per iOS 8-11.

inserisci qui la descrizione dell'immagine


0

Ho trovato il modo più semplice per farlo, specialmente se stai aggiungendo la vista tabella all'interno della barra delle schede è prima aggiungere una vista e quindi aggiungere la vista tabella all'interno di quella vista . Questo ti dà le guide ai margini più alti che stai cercando.

inserisci qui la descrizione dell'immagine


-1

guarda tutte le soluzioni: il mio progetto è solo usare xib, quindi la soluzione con storyboard non ha funzionato per me. self.edgesForExtendedLayout = UIRectEdgeNone; funziona solo per il controller se la barra di navigazione è visibile. ma se la tua vista ha solo la barra di stato, non funzionerà. quindi unisco due condizioni.

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

aiutare questo funziona.


-2

Se devi supportare anche iOS 6, dovrai spostarlo condizionatamente verso il basso. Cioè, in iOS 7 dovresti semplicemente spostarlo di 20 punti verso il basso (attraverso la framemanipolazione o usando il layout automatico) e in iOS 6 lo lasci da solo. Non credo che tu possa farlo in IB, quindi dovrai farlo in codice.

MODIFICARE

Puoi effettivamente farlo in IB, usando i delta iOS6 / iOS7. Imposta la tua posizione in iOS 7, quindi per iOS 6 imposta il delta Y su -20punti. Vedi questa domanda SO per ulteriori informazioni.


L'impostazione del frame in basso non lo modifica purtroppo.
Nicholas Smith,

Cosa non funziona al riguardo? La vista tabella non si sposta verso il basso?
Scott Berrevoets,

Sì, rimane nella stessa posizione. Ho provato self.view.framee self.tableView.frame, in entrambi viewWillAppeare viewDidLoad. Per sicurezza, ho anche deciso setContentNeedsDisplaydi forzare un ridisegno.
Nicholas Smith,

Il layout automatico è abilitato?
Scott Berrevoets,

Sì, è autolayout e Storyboard.
Nicholas Smith,
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.