2013-02-13 20 views
7

Come posso ottenere le dimensioni effettive di una vista o di una sottoview che sto controllando? Per esempio:Ottieni dimensioni reali della vista iOS

UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0,200,100)]; 
[self addSubview:firstView]; 

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 20, 230, 120)]; 
[firstView addSubview:button]; 

Come si può vedere, il mio oggetto button supera le dimensioni della vista che viene aggiunto a.

Con questo è la mente (supponendo che ci siano molti oggetti aggiunti come sottoview), come posso determinare la larghezza e l'altezza effettive di firstView?

+0

Sono rispettivamente 230 e 120, non vedo quale sia il tuo problema. –

+1

firstView.bounds.size.height (larghezza) danno la sua dimensione –

+0

@ H2CO3 non è però così, è 240 e 140 a causa del posizionamento xey del pulsante. Ad ogni modo, non era questa la domanda .. Con le aggiunte programmatiche di subViews che superano i limiti della vista di destinazione, puoi calcolare i limiti effettivi di UIView originale? – GeorgeBuckingham

risposta

4

Se si desidera avere il tasto ha la stessa larghezza e altezza FirstView si dovrebbe utilizzare la proprietà limiti di UIView come questo:

UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0,200,100)]; 
[self addSubview:firstView]; 

UIButton *button = [[UIButton alloc] initWithFrame:firstView.bounds]; 
[firstView addSubview:button]; 

Per ottenere solo la larghezza/altezza FirstView si potrebbe fare qualcosa di simile:

CGSize size = firstView.bounds.size; 
NSInteger width = size.width; 
NSInteger height = size.height; 
0

La prima vista è davvero a 200 x 100. Tuttavia, il punto di vista interno non vengono tagliate a meno di utilizzare clipsToBounds.

Una soluzione preferibile al problema è interrompere l'aggiunta di viste che superano le dimensioni o interrompere il ridimensionamento delle viste in modo che esse trabocchino lo spazio disponibile, a seconda dei casi.

(Per calcolare effettivamente i limiti completi comprese tutte le sottoview nella gerarchia non è difficile, solo un sacco di lavoro che in realtà non ti porterà ovunque. UIView accade per consentire alle viste di essere più grandi dei loro contenitori, ma non Deve necessariamente dare garanzie su ciò che funzionerà correttamente ed è probabile che sia una fonte di bug se sfruttato. Il motivo per clipsToBounds è probabilmente che il clipping è costoso ma necessario durante l'animazione, dove le sottoview possono essere temporaneamente spostate fuori limite per Ai fini di un effetto prima di essere rimossi dalla vista.)

0

firstview.frame.size.width firstview.frame.size.height

+0

potrebbe non funzionare correttamente se la vista è stata ruotata ... vedi http://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center –