Su ulteriori indagini (visualizzazione della gerarchia di sottomenu della cella) Interface Builder inserisce subview all'interno della cella contentView
, semplicemente non sembra.
La causa principale del problema era l'autolayout di iOS 6. Quando la cella viene posizionata in modalità di modifica (e rientrata), anche lo contentView
è rientrato, quindi è ovvio che tutte le sottoview all'interno dello contentView
si sposteranno (rientro) in virtù del fatto che si trova all'interno dello contentView
. Tuttavia, tutti i vincoli di autolayout applicati da Interface Builder sembrano essere relativi allo stesso UITableViewCell
, anziché allo contentView
. Ciò significa che, nonostante i rientri contentView
, le immagini secondarie contenute all'interno non lo fanno, i vincoli prendono il sopravvento.
Ad esempio, quando ho inserito uno UILabel
nella cella (e posizionato 10 punti dal lato sinistro della cella) IB ha applicato automaticamente un vincolo "Spazio orizzontale (10)". Tuttavia, questo vincolo è relativo allo UITableViewCell
NON allo contentView
. Ciò significa che quando la cella è rientrata e lo contentView
si sposta, l'etichetta rimane inserita poiché rispetta il vincolo per rimanere 10 punti dal lato sinistro dello UITableViewCell
.
Sfortunatamente (per quanto ne so) non c'è modo di rimuovere questi vincoli creati da IB all'interno di IB stesso, quindi ecco come ho risolto il problema.
All'interno della sottoclasse UITableViewCell
per la cella, ho creato uno IBOutlet
per quel vincolo chiamato cellLabelHSpaceConstraint
. È inoltre necessario un IBOutlet
per l'etichetta stessa, che ho chiamato cellLabel
. Poi implementato il metodo -awakeFromNib
come sotto:
- (void)awakeFromNib {
// -------------------------------------------------------------------
// We need to create our own constraint which is effective against the
// contentView, so the UI elements indent when the cell is put into
// editing mode
// -------------------------------------------------------------------
// Remove the IB added horizontal constraint, as that's effective
// against the cell not the contentView
[self removeConstraint:self.cellLabelHSpaceConstraint];
// Create a dictionary to represent the view being positioned
NSDictionary *labelViewDictionary = NSDictionaryOfVariableBindings(_cellLabel);
// Create the new constraint
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[_cellLabel]" options:0 metrics:nil views:labelViewDictionary];
// Add the constraint against the contentView
[self.contentView addConstraints:constraints];
}
In sintesi, il sopra rimuoverà il vincolo orizzontale spaziatura che IB aggiunto automaticamente (come è efficace contro il UITableViewCell
anziché contentView
) e quindi definire e aggiungi il nostro vincolo allo contentView
.
Nel mio caso, tutti gli altri UILabels
nella cella sono stati posizionati in base alla posizione dello cellLabel
così quando ho corretto il vincolo/posizionamento di questo elemento tutti gli altri hanno seguito l'esempio e posizionato correttamente. Tuttavia, se si dispone di un layout più complesso, potrebbe essere necessario farlo anche per altri sottoview.
Ne sei sicuro? L'ultima volta che ho disposto una cella in un pennino, mentre non sembrava che aggiungessi viste secondarie alla vista del contenuto, in fase di esecuzione nel debugger tutto era nella visualizzazione del contenuto. Vale la pena verificare nel debugger se non l'hai già ... –
Grazie Carl. Avevi ragione: tutte le visualizzazioni secondarie vengono aggiunte a contentView. Il problema era correlato all'autosayout di iOS 6. Ho incluso una risposta che illustra come il problema è stato risolto. – Skoota