2013-03-02 11 views
15

Ho una sottoclasse UIView personalizzata che aggiunge una sottoview in modo programmatico durante l'inizializzazione. Sto volendo che questa sottoview abbia la stessa larghezza della visualizzazione UIV personalizzata.Come ottenere dimensioni di un UIView personalizzato aggiunto tramite storyboard in initWithCoder :?

mio codice funziona bene se programatically aggiungo l'UIView personalizzato. Tuttavia, quando l'UIView viene inizializzato tramite lo Storyboard , non riesco a ottenere la larghezza di UIView personalizzata.

// Init programatically 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSLog (@"view: %f", self.frame.size.width); //WILL return width 
     NSLog (@"view: %f", self.bounds.size.width); //WILL return width 
    } 
    return self; 
} 

// Init from storyboard 
- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     NSLog (@"view: %f", self.frame.size.width); //Returns 0 
     NSLog (@"view: %f", self.bounds.size.width); //Returns 0 
    } 
    return self; 
} 

Quando initWithCoder: è gestito da StoryBoard, struttura e limiti della UIView sono tutti restituiti come 0. esiste un modo di accedere dimensioni della UIView all'interno initWithCoder ?? Oppure, almeno accedere alle dimensioni prima di drawRect: viene chiamato?

Grazie.

risposta

13

Invece di impostare le dimensioni subviews nella funzione init, impostarlo relativa alla vista personalizzata nel metodo layoutSubviews della visualizzazione personalizzata. Fare questo qui significherà che anche la larghezza della sottoview cambierà sempre per adattarsi alla larghezza della vista personalizzata anche se cambi le dimensioni della vista personalizzata in qualsiasi momento dopo l'inizializzazione.

+0

Aaaah. Grazie! Alla prova hai davvero ragione. layoutSubviews: ha avuto le dimensioni disponibili e viene chiamato prima di drawRect :! Proprio quello che stavo cercando. –

+4

Per aggiungere qualche spiegazione in più, se stai utilizzando l'Autolayout (che penso che tu sia), i limiti della vista del controller della vista e delle sue sottoview non sono disponibili fino a quando non è avvenuto il layout - 'viewDidLayoutSubviews' viene chiamato sulla tua vista controller dopo questo è successo. – jrturton

+0

Grazie per l'aiuto :) –

2

È possibile riutilizzare la chiamata standard initWithFrame.

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     [self initWithFrame:[self frame]]; 

     NSLog (@"view: %f", self.frame.size.width); 
     NSLog (@"view: %f", self.bounds.size.width); 
    } 
    return self; 
} 
+0

va bene in un UIViewController, ma non in una sottoclasse UIView personalizzata. 'self' è già una 'vista' - cioè non esiste una proprietà 'view' per 'self' in UIView. –

+0

@ SoOverIt- controlla la mia modifica – iPatel

+0

utilizzando il codice modificato, viene visualizzato un errore del compilatore 'Il risultato di una chiamata init delegata deve essere immediatamente restituito o assegnato a 'self'. –

Problemi correlati