2012-07-09 9 views
5

Ho uno storyboard con 1 UIViewController, contenente 1 UIView che contiene un numero di nidificazione UIView s. Ho sottoclasse il controller View per implementare questo metodo:UIView ha dimensioni verticale mentre è in orizzontale?

- (BOOL)shouldAutorotateToInterfaceOrientation: UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeRight || interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

Ho anche aggiunto

<key>UISupportedInterfaceOrientations</key> 
    <array> 
    <string>UIInterfaceOrientationLandscapeLeft</string> 
    <string>UIInterfaceOrientationLandscapeRight</string> 
    </array> 
<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeLeft</string> 

al Info.plist.

Nel viewDidLoad del UIView principale sto facendo questo:

Il problema è il controllo è solo 756px di larghezza anziché l'atteso 1024. Vedere la schermata qui sotto per i dettagli. enter image description here Ho cercato su tutto il web ma non riesco a trovare una soluzione a questo problema frustrante ovunque. Sto usando Xcode 4.5 con iOS5.1 impostato come base SDK.

EDIT Funziona sostituendo il telaio con i limiti. Tuttavia, non capisco cosa sta succedendo, quindi non funziona con le dimensioni del fotogramma.

risposta

11

Il rettangolo telaio, che descrive la posizione e dimensione della vista in sistema di coordinate sua del superview.

@property (atomici) CGRect cornice

e

i limiti rettangolo, che descrive la posizione e dimensione della vista in proprio sistema di coordinate.

@property (atomici) CGRect delimita

Usa limiti, non incorniciare.

+0

Grazie! Sostituire 'frame' con i limiti funziona! Tuttavia, non capisco davvero perché? Qualche possibilità di farlo funzionare con frame? Non capisco perché la dimensione di UIView sia diversa nella superview e nel suo sistema di coordinate – s1m0n

+0

Dalla mia comprensione ciò accade perché la vista si trova sulla finestra e quella finestra deve avere una modalità landscape interna, se questo è in qualche modo vicino ad essere true, le coordinate della vista sul sistema di coordinate della finestra non riflettono la rotazione quando la finestra viene ruotata insieme alla sua vista e le sue viste secondarie. Potresti voler aggiornare la conoscenza del sistema di coordinate per una migliore comprensione (rotazione e forse la transizione deve essere sufficiente per questo caso): http://en.wikipedia.org/wiki/Cartesian_coordinate_system Quella è una matematica scolastica come ricordo. –

+1

Probabilmente varrebbe la pena di leggere attraverso http://stackoverflow.com/questions/1210047/iphone-development-whats-the-difference-between-the-frame-and-the-bounds, e alcune delle domande collegate. –

2

Impostare lo autoresizingMask su qualsiasi visualizzazione che si desidera automatizzare ruotando. Come questo:

[myView setAutoresizingMask:UIViewAutoresizingMaskFlexibleWidth | UIViewAutoresizingMaskFlexibleRightMargin]; 
+1

Grazie per la risposta. Ma non sto cercando di autorotare la mia app o qualcosa del genere. La modalità Paesaggio è abbastanza per me. Quindi non dovrebbe essere autorotato o altro, voglio solo che restituisca le dimensioni del paesaggio corrette. – s1m0n

0

Il problema è perché prima di caricare in modalità Landscape vostre linee di codice è la chiamata al metodo di caricamento nel quale metodo sta chiamando questo [PASectionView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 180)]; [self addSubview:sectionView]; se è vista classe controller allora dovrebbe essere [PASectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)]; [self addSubview:sectionView]; se è sottoclasse di UIView quindi dove hai ottenuto il metodo ViewDidLoad. Ora per risolvere il problema in .h classe: scrivere questo PASectionView * sectionView; in .m classe implementare questo metodo

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
{ 

} 
else // OrientationLandscape 
{ 
sectionView.frame = CGRect(sectionView.frame.origin.x,sectionView.frame.origin.y,self.view.frame.size.width,180);  
} 
0

è necessario impostare la maschera di ridimensionamento automatico per l'visualizzazione secondaria,

Aggiungere questa riga di codice prima di aggiungere la visualizzazione secondaria al superview, se la vostra visualizzazione secondaria viene aggiunto dal codice. yourSubView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

else se il tuo subView è stato aggiunto nel file pennino, selezionare i magneti del bordo e il ridimensionamento delle maschere nelle proprietà della subView nel file pennino.

Problemi correlati