2010-07-28 18 views
12

Ho una sottoclasse di UIView che deve calcolare la sua altezza in base alla sua larghezza. Quando viene creato nel codice, tutto funziona. Tuttavia, quando provo a creare la vista in Interface Builder e sebbene eseguo l'override di tutti i metodi correlati, non riesco a ottenere la dimensione della vista impostata nel builder dell'interfaccia.Caricamento di una sottoclasse UIView da problemi di dimensione NIB

Quindi la mia prossima ipotesi è stata forse la superview del mio punto di vista è impostare il frame della mia vista dopo awakeFromNib. Bene, risulta che non lo fa. Ho sovrascritto setFrame sulla mia vista, e viene chiamato durante initWithCoder.

Quindi questo è quello che so finora:

  1. Prima initWithCoder si chiama
  2. Durante initWithCoder una chiamata a SETFRAME: (CGRect) Aframe viene inviato
  3. nel SETFRAME la dimensione del telaio è corretta, e che io chiamo [super SETFRAME: Aframe]
  4. awakeFromNib si chiama
  5. super.frame.size.width = 0 in awakeFromNib self.frame.size.width è anche 0
  6. Quando il processo è terminato, sembra che la vista sia qualche pixel sotto dove si suppone di essere, ma immagino che il mio codice diventi così ingombrante con le dimensioni che potrebbe essere qualcosa che faccio.

Qualsiasi aiuto sarà apprezzato

+0

La questione è in realtà tutto sbagliato, ormai. Ho postato personalmente una risposta che è stata cancellata per qualche motivo. Il mio errore principale era usare% d per stampare le dimensioni del fotogramma quando è un float. Questo mi ha completamente buttato fuori. La tua risposta in realtà non sta facendo nulla per quanto posso vedere che non l'ho fatto. –

risposta

15

Se si estende initWithCoder, assicurarsi di chiamare il metodo eccellente. È durante questa super chiamata che setFrame verrà chiamato sulla tua classe.

È quindi possibile riutilizzare la chiamata standard initWithFrame.

faccio sempre il seguente:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method. 
    return [self initWithFrame:[self frame]]; 
} 
+5

Tuttavia, non sta inizializzando il controllo per due volte? – Oren

Problemi correlati