2009-11-17 14 views
17

Ho riscontrato un problema durante l'utilizzo di addSubview.Rendere la vista ridimensionata al suo genitore quando aggiunto con addSubview

codice Esempio:

ParentView *myParentView = [[ParentView alloc] initWithNibName:@"ParentView " bundle:nil]; 
ChildeView *myChildeView = [[ChildeView alloc] initWithNibName:@"ChildeView" bundle:nil]; 

//... parent frame resized with setFrame lets say to x:0, y:0, W:320, H:411 

[[myParentView view] addSubview: [myChildeView view]]; 

mio figlio quando aggiunto è più grande allora il genitore, e non ridimensiona il suo telaio a limiti genitore. Non riesco a utilizzare "sottoview di clip" sul genitore e "Autoresize Subviews" sembra non funzionare se il frame principale non viene ridimensionato di nuovo. Esiste una proprietà che fa ridimensionare automaticamente una visualizzazione secondaria ai limiti del relativo genitore senza utilizzare setFrame su ogni figlio?

risposta

30

Se non si utilizza il layout automatico, si è tentato di impostare la maschera di autoresposizione della vista secondaria? Prova questo:

myChildeView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | 
           UIViewAutoresizingFlexibleHeight); 

Inoltre, potrebbe essere necessario chiamare

myParentView.autoresizesSubviews = YES; 

per ottenere la vista padre per ridimensionare le sue subviews automaticamente quando i suoi cambiamenti del telaio.

Se si sta ancora vedendo il disegno della vista figlio al di fuori della cornice della vista genitore, ci sono buone probabilità che la vista genitore non ritagli il suo contenuto. Per rimediare, chiamare

myParentView.clipsToBounds = YES; 
+0

Grazie per la risposta, anche se non funziona. Ma perché non è questo il comportamento predefinito di UIView. Sto producendo codice divertente? E perché i sottotitoli di clip invece funzionano? – Luca

+0

Stai modificando la cornice della vista genitore prima di aggiungere la vista figlio? –

+0

Sì, sempre lo stesso problema. – Luca

0

Si può sempre farlo nel vostro UIViews - (void)didMoveToSuperview metodo. Viene chiamato quando aggiunto o rimosso dal genitore (zero se rimosso). In quel momento, imposta la tua taglia su quella del tuo genitore. Da quel punto la maschera autoresize dovrebbe funzionare correttamente.

+0

Informa il destinatario che il suo superview è cambiato (probabilmente a zero). Sembra che non funzioni su addSubview. – Luca

7

Basta copiare il frame della vista genitore nella vista figlio, quindi aggiungerlo. Dopo quell'autorizzare funzionerà. In realtà si dovrebbe copiare solo la dimensione CGRectMake (0, 0, parentView.frame.size.width, parentView.frame.size.height)

childView.frame = CGRectMake(0, 0, parentView.frame.size.width, parentView.frame.size.height); 
[parentView addSubview:childView]; 
+0

Ma questo non è un autoresize, è solo un clone mesures dal parentView – lojals

+0

Ecco perché ho aggiunto "Dopo che l'autoresizing funzionerà". Puoi impostarlo in Interface Builder di XCode o come indicato in altre risposte qui. Se la sottoview ha una strana geometria all'interno del suo genitore, l'autoresizing produrrà risultati strani. – cat

Problemi correlati