2014-10-15 13 views
5

Sto provando a configurare un semplice UITableViewCell in Interface Builder senza il layout automatico. Sto usando le vecchie molle e montanti.Ridimensionamento di molle e montanti rotto su iOS 8 UITableViewCell

Quando do un'etichetta una larghezza flessibile, sembra tracciare come se il UITableViewCell ha una larghezza molto più grande, anche se il UITableViewCell mi dice che ha una larghezza di 375 pixel in layoutSubviews:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    NSLog(@"Label width: %f", self.nameLabel.frame.size.width); // 695.0 for a label that stretches the whole width 
    NSLog(@"Superview (UITableViewCell) width: %f", self.nameLabel.superview.frame.size.width); // 375.0 
} 

Su una simulati iPhone 5S (iOS 7 o 8), il superview è 320 ma l'UILabel diffonde a 640.

Su un iPhone simulato 6, il superview è 375 ma l'UILabel diffonde a 695.

On un iP simulato hone 6 Plus, la superview è 414 ma le spille UILabel a 734.

Non ho questo problema con altre viste. Ad esempio, sono in grado di aggiungere uno UILabel a un UIViewController e farlo allungare correttamente la larghezza. Cosa sta succedendo? E come posso risolvere questo?

EDIT:

È interessante notare che, se aggiungo i vincoli di programmazione durante cellForRowAtIndexPath: allora sembra funzionare come previsto, fino a quando io uso il più vecchio dequeueReusableCellWithIdentifier invece di dequeueReusableCellWithIdentifier:forIndexPath:. Tuttavia, voglio mantenere tutti i miei limiti in Interface Builder. Qualche idea?

+1

questo potrebbe essere correlato a questo: http://stackoverflow.com/a/25884832/3899770 – Aris

risposta

1

Oggi ho giocato un po 'con questo. Sembra che il frame dell'etichetta quando è istanziato rispetto al frame della vista del contenuto sia sbagliato. Se faccio l'etichetta della stessa dimensione della cella nello storyboard, quindi in awakeFromNib il contentView ha una dimensione di CGRectZero ma l'etichetta ha la dimensione che ho impostato nello storyboard. Pertanto, quando si arriva a layoutSubviews e il contentView viene ridimensionato alla dimensione corretta (0,0,320,44), a causa della maschera di larghezza flessibile, l'etichetta stessa viene ridimensionata insieme alla vista del contenuto (la larghezza aumenta anche di 320). Ecco perché appare più grande del previsto.

L'unico modo in cui potrei aggirare questo (anche se sembra un trucco grossolano e dovresti probabilmente limitarti al layout automatico), era di impostare il frame dell'etichetta rispetto alla visualizzazione del contenuto in awakeFromNib.

- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    self.label.frame = self.bounds; 
} 
+0

Bingo! Grazie John :) Attaccherò con il layout automatico per le celle. Per fortuna sono nei loro pennini, quindi non influenzeranno il resto del progetto. –

Problemi correlati