2013-05-27 11 views
5

Ho un UIView di cui altezza e larghezza, in rotazione a 90 gradi, sono interscambiati. Ora, quando provo ad aumentare l'altezza o la larghezza, ottengo un aspetto anormale. Come cambio l'altezza di un UIView ruotato?Rotazione di un UIView senza il cambio del frame

+0

Ho solo bisogno di un modo modificare l'angolo del modo in cui appare sullo schermo. –

+5

'view.transform = CGAffineTransformMakeRotation (M_PI/2);' –

+1

Le 90 gradi è stato un esempio. Sto ruotando la vista manualmente. L'altezza e la larghezza cambiano quando lo faccio. Devo solo cambiare l'angolo della vista sullo schermo. –

risposta

8

La Documentazione di Apple afferma che la proprietà delle viste frame diventa indefinita quando la vista transform non è la trasformazione dell'identità.

La rotazione della vista modifica la trasformazione della vista.

Ora, perché questo invalida la cornice? La documentazione di Apple è in realtà un po 'imprecisa: la proprietà frame non diventa completamente priva di significato per le viste trasformate. Invece, rifletterà ora il rettangolo di delimitazione della vista, cioè il più piccolo rettangolo verticale in cui la vista trasformata può adattarsi.

Questo perché frame è in realtà una proprietà derivata. Se si desidera modificare il "altezza reale" di una visione trasformata, che è, l'altezza in un proprio sistema di coordinate (prima di applicare la trasformazione), c'è una proprietà per questo: bounds.

Quindi, in poche parole:

CGRect bounds = myView.bounds; 
bounds.size.height = newHeight; 
myView.bounds = bounds; 
+0

Quindi, se entro queste righe nel mio codice, dove dovrei aggiungere il CGAffineTransformMakeRotation parte? Dopo o prima? –

+0

Amico, hai reso la mia giornata. Diamine, grazie. –

+0

Grazie; felice di poterti aiutare! Per la cronaca (sono sicuro che hai capito questo fuori da soli, ormai): Se stai cambiando i limiti, non importa se si sta cambiando la trasformazione prima o dopo. Se stai cambiando il telaio, essere sicuri di fare questo solo mentre 'CGAffineTransformIsIdentity (myView.transform)' è SI (i. E. Prima di cambiare la trasformazione). Dai un'occhiata a questo post sul blog (non da me) per ulteriori informazioni sul frame vs. limiti cosa: http://ashfurrow.com/blog/you-probably-dont-understand-frames-and-bounds – fzwo

1

Usa seguente metodo ...

- (void) runSpinAnimationOnView:(UIView*)view duration:(CGFloat)duration rotations:(CGFloat)rotations repeat:(float)repeat; 
{ 
    CABasicAnimation* rotationAnimation; 
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
    rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ]; 
    rotationAnimation.duration = duration; 
    rotationAnimation.cumulative = YES; 
    rotationAnimation.repeatCount = repeat; 

    [view.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"]; 
} 
Problemi correlati