2015-09-21 4 views
6

Nella mia app ho tabelle personalizzateViewCells con un rapporto fisso (16x9). Per ottenere ciò, ho posizionato una vista nella cella, fissandola alla sua vista genitore (sebbene l'abbia fatta nel builder dell'interfaccia: V/H:|-[innerView]-|). Inoltre, ho messo un vincolo di rapporto su di esso.UITableViewAutomaticDimension non funziona correttamente su iOS 9

Nella mia tabellaViewController sto usando UITableViewAutomaticDimension come altezza di una cella di tabella.

L'altezza di riga stimata è 180, che è la dimensione esatta che la cella avrà su un display largo 320px (come io, come potete vedere, fare).

Sto ancora distribuendo per 8.4, ma quando si esegue il progetto su un dispositivo con iOS 9, ottengo tonnellate di avvisi di layout automatico, anche se tutto funziona bene e sembra perfetto.

L'avviso stesso ha assolutamente ragione. Ci sono due vincoli che non voglio - questi che iOS ha aggiunto da solo.

2015-09-29 11:24:57.771 app[1039:324736] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x147d3e0d0 UIView:0x14901ff70.height == 0.5625*UIView:0x14901ff70.width>", 
    "<NSLayoutConstraint:0x147dd0210 H:|-(0)-[UIView:0x14901ff70] (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x147deeca0 V:|-(0)-[UIView:0x14901ff70] (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x149053c30 V:[UIView:0x14901ff70]-(0)-| (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x147dbc2b0 H:[UIView:0x14901ff70]-(0)-| (Names: '|':UITableViewCellContentView:0x14901f960)>", 
    "<NSLayoutConstraint:0x149070800 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x14901f960(179.5)]>", 
    "<NSLayoutConstraint:0x1490707b0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x14901f960(320)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x147d3e0d0 UIView:0x14901ff70.height == 0.5625*UIView:0x14901ff70.width> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

L'unica cosa che vedo qui sono gli 0,5 pixel mancanti che iOS ha sottratto in qualche modo magicamente.

+0

L'unica cosa che vedo qui sono gli 0,5 pixel mancanti che iOS ha sottratto in qualche modo magicamente? Dove sono queste informazioni? – BangOperator

+0

@somexyz legge i vincoli registrati: 'V: [UITableViewCellContentView: 0x14da0ff60 (179.5)]' –

risposta

1

Il problema sono i due vincoli che la vista tabella aggiunge automaticamente. Layout-Encapsulated-Layout-UIView-height e width sono probabilmente l'altezza e la larghezza della vista tabella calcolata per la cella durante il caricamento iniziale, in base ai vincoli della cella in quel momento.

"<NSLayoutConstraint:0x149070800 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x14901f960(179.5)]>", 
"<NSLayoutConstraint:0x1490707b0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x14901f960(320)]>" 

Come le priorità di questi vincoli sono 1000 che cosa si può fare è abbassare le vostre priorità altezza e la larghezza di vincolo e lasciare che la dimensione incapsulato da applicare in caso di necessità (a carico).

+0

Questo, infatti, ha aiutato. Grazie per la - breve - spiegazione sulla tempistica (caricata). Puoi dire qualcosa sulla differenza tra iOS 8 e iOS 9 ?? Ho sicuramente bisogno/voglio sapere perché solo iOS 9 lo sta facendo in modo diverso ... –

+0

Non so davvero cosa sia cambiato nel motore di layout automatico in iOS 9 ma questo è successo anche in iOS 8. – Istvan

+0

Sì. Questo potrebbe essere successo anche in iOS 8, per quanto si sta parlando di questo avviso di layout automatico per scopi più o meno generici. Nel mio caso questo avviso appare solo in iOS9, non in 8, quindi ho aperto questa domanda. –

1

Sembra che siano stati aggiunti due vincoli di rapporto aggiunti su due viste differenti.

Uno che dovrebbe essere c'è,

<NSLayoutConstraint:0x14d939e00 UIView:0x14da107f0.width == 
1.77778*UIView:0x14da107f0.height> 

ha indirizzo di memoria 0x14d939e00 aggiunto l'UIView con l'indirizzo 0x14da107f0.

L'altro si sta rompendo.

<NSLayoutConstraint:0x14c5eae90 UIView:0x14c5ead30.height == 
    0.5625*UIView:0x14c5ead30.width> 

Questo è aggiunto su un UIView (0x14c5ead30). Cerca questa vista e rimuovi questo vincolo di rapporto.

+0

Spiacente, ho confuso l'inizio di quello con la fine di un altro registro. Questo è il motivo per cui né l'indirizzo né i valori si adattano insieme. C'è solo un vincolo e visto che funziona bene su iOS 8 non penso che sia un problema di layout automatico generale. –