2015-04-10 14 views
12

Mi sono imbattuto in uno strano comportamento, in cui le celle aggiunte a UITableView erano a volte rientrate a sinistra. Questo accade solo su iOS 8.3 e non riesco a trovare un modello chiaro su quando ciò accade.iOS 8.3 - Cella UITableView non allineata, rientranza a sinistra

Qualcuno sta vivendo la stessa cosa?

+0

Sto sperimentando la stessa cosa .. http://stackoverflow.com/questions/29824830/has-anything-changed-with-custom-uitableview-prototype-cells-constraints-since-i – mm24

risposta

6

Bene - questo è strano ...

Sembra che a volte UITableViewCellContentView s' contentView non sia allineato con il UITableViewCellContentView stessa. Ciò accade quando lo UITableView è di per sé una parte di un layout più ampia dello schermo (come nel caso di un cercapersone orizzontale).

Fortunatamente, la soluzione è semplice: aggiungere un vincolo per allineare il contentView con il genitore. Questo può essere fatto solo programmaticamente, poiché non è possibile modificare i vincoli di contentView nell'editor di layout.

- (void)awakeFromNib { 
    // Initialization code 

    // iOS 8.3 bug, where contentView's x position isnt aligned with self's x position... 
    // So we add a constraint to do the obvious... 
    [self addConstraint:[NSLayoutConstraint constraintWithItem:self.contentView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0f constant:0.0f]]; 
} 

Questo ha iniziato solo accadendo su iOS 8.3, ma la correzione sembra essere sicuro e compatibile con le versioni precedenti pure.

Come sempre, si prega di commentare con la propria esperienza.

+1

Non sai come hai scoperto questo, ma sono molto grato per questo. Molte delle mie celle da tavolo sembravano strane e non avevo idea del perché. Questo ha risolto tutti loro. Grazie! –

+0

Felice potrei fornire un aiuto. – Vaiden

+0

Quindi ho notato che mentre questo sembra aver risolto questo problema quando sto costruendo usando l'SDK 8.3 ed eseguendo il 8.2, quando effettivamente aggiorno un iPad a 8.3, persiste. Altre idee? –

3

Sembra che sia a causa della proprietà layoutMargins. Ho deselezionato il mio secondo vincolo di vincolo "Relativo al margine" e tutto ha funzionato alla grande. Ecco lo article.

+0

Grazie per l'input. Tuttavia non avevo vincoli di margine e il problema è iniziato con iOS 8.3. – Vaiden

0

Ho visto una variazione di questo problema con un'app a cui sto lavorando. Vediamo alcune celle di visualizzazione tabella con allineamento iniziale/finale errato.

Non è connesso a iOS 8.3, si verifica solo quando si costruisce con Xcode 6.3. Posso prendere lo stesso progetto e costruirlo su Xcode 6.2 e non si verifica.

Dopo alcune indagini, si scopre che ciò si verifica solo sulle celle di visualizzazione tabella in xibs.

La soluzione è rimuovere il limite iniziale/finale sui margini e impostarli direttamente nella superview (ovvero la vista del contenuto della cella).

+0

Questo deve essere un problema diverso allora. Il problema riportato da I (OP) è stato riscontrato dagli utenti che hanno eseguito l'aggiornamento da iOS 8.2 a 8.3, utilizzando la nostra versione dell'app compilata e inviata da XCode 6.2. – Vaiden

13

My tableViewCells vedeva margini aumentati a sinistra e a destra quando eseguito su iOS 8.3 che non ho visto nelle versioni precedenti.

Ambito:

self.contentView.preservesSuperviewLayoutMargins = NO; 

risolto il mio problema e tenuto i miei margini coerenti su tutte le versioni, ma essere consapevoli che questo disponibile solo su iOS 8+.

Quindi, ecco, per esempio, è dove si potrebbe fare questo:

- (void)awakeFromNib { 
    if ([self.contentView respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { 
     self.contentView.preservesSuperviewLayoutMargins = NO; 
    } 
} 
+1

Questo ha funzionato perfettamente per me. Basta averlo inserito in un 'if (respondsToSelector)' check in 'awakeFromNib' e ha bloccato il rientro extra. – Stonz2

+0

Sto vivendo la stessa cosa! Potresti dirmi come risolvere se non utilizzo lo storyboard? self.tableView = UITableView (frame: CGRectMake (0, 0, self.view.frame.size.width, self.view.frame.size.height), stile: UITableViewStyle.Plain) self.tableView! .delegate = auto self.tableView .dataSource = auto self.tableView .registerClass (UITableViewCell.self, forCellReuseIdentifier: "cella")!! Grazie – webmastx

+0

Questa aiutato con un problema che ho avuto quando si verifica un guasto tableView interfaccia utente in iOS 11 che non c'era anche in iOS 10. Grazie! –

0

Questa fissato per me. Ho appena smesso di utilizzare le proprietà e textLabel di UITableViewCell ricollegate alle mie prese.

Problemi correlati