2013-06-11 1 views
2

Je souhaite effectuer un changement de disposition lorsque les périphériques pivotent. Donc, je mets en œuvre la méthode - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration pour faire le travail. Mais je réalise quand cette méthode est appelée self.view.frame et self.view.bounds sont différents. Le self.view.bounds.size est correct et le self.view.frame.size ne semble toujours pas pivoter.pourquoi self.view.frame et self.view.bounds sont différents lorsque les périphériques tournent?

Par exemple, i new un projet vide SingleView et mettre en œuvre la méthode comme suit:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    NSLog(@"willAnimateRotationToInterfaceOrientation"); 

    NSLog(@"self.view.bounds.size width:%f height:%f ",self.view.bounds.size.width,self.view.bounds.size.height); 
    NSLog(@"self.view.frame.size width:%f height:%f",self.view.frame.size.width,self.view.frame.size.height); 

} 

lorsque le dispositif tourne du mode portrait au paysage. la sortie est la suivante:

2013-06-11 11:57:46.959 viewDemo[95658:707] willAnimateRotationToInterfaceOrientation 
2013-06-11 11:57:46.961 viewDemo[95658:707] self.view.bounds.size width:1024.000000 height:748.000000 
2013-06-11 11:57:46.961 viewDemo[95658:707] self.view.frame.size width:748.000000 height:1024.000000 

Je me demande pourquoi ces tailles sont différentes? Ils ne devraient pas toujours être les mêmes? Et quand choisir lequel utiliser?

Toute aide sera appréciée.

+0

Si vous regardez dans la documentation, il indique que si la transformation est autre chose que le transformation d'identité le paramètre frame ne doit pas être utilisé. Ajoutez des journaux pour la transformation de la vue pour voir à quoi ils ressemblent dans différentes rotations. – Abizern

Répondre

5

Regardez le answer by "tc.", ce qui est accepté dès maintenant. Copier quelques lignes de cette réponse à ici. Ainsi, le "cadre" est relatif à la vue parente, qui dans ce cas est la fenêtre d'interface utilisateur (UIWindow). Lorsque vous faites pivoter le périphérique, la fenêtre ne pivote pas; la vue du contrôleur de vue fait. Du point de vue de la fenêtre, tout est effectivement en mode portrait. C'est pourquoi même après que l'appareil est passé en mode paysage, self.view.frame ne changera pas.

Vous devez utiliser self.view.bounds pour effectuer tout calcul car il vous donne les valeurs correctes indépendamment de l'orientation de votre périphérique.

+0

pourquoi la fenêtre ne tourne pas? – chancyWu

+0

@chancy Ce que je suppose est que seulement UIView peut être tourné. C'est ainsi que Apple a conçu SDK que nous ne pouvons rien modifier lié à UIWindow. Pendant la rotation de l'appareil, la super vue de la vue (c'est-à-dire la fenêtre) est visible dans les coins, ce qui semble être fixe et ne pas tourner avec la vue. Et, par conséquent, self.view.frame n'a pas changé. – Geek

+0

Voulez-vous dire self.view.frame ne sera pas modifié lorsque l'appareil tourne? – chancyWu

0

s'il vous plaît noter que frame.size ne correspond pas à bounds.size lorsque le simulateur est mis en rotation

se référer à celui-ci UIView frame, bounds and center

+0

Je vois, mais pourquoi ces tailles sont différentes lors de la rotation? – chancyWu

2

Je me demande pourquoi ces valeurs sont différentes? Ils ne devraient pas toujours être les mêmes?
Les bornes d'un UIView est le rectangle, exprimé en un lieu (x, y) et la taille (largeur, hauteur) par rapport à son propre système de coordonnées (0,0).

Le cadre d'un UIView est le rectangle, exprimé en un lieu (x, y) et la taille (largeur, hauteur) par rapport à la superview il est contenu dans.

Dans le cas des bornes, les coordonnées x et y sont à 0,0 car ces coordonnées sont relatives à la vue elle-même. Cependant, les coordonnées du cadre x et y sont relatives à la position de la vue dans la vue parent

Et quand choisir lequel utiliser?
Espérons que cela aide à clarifier les circonstances où chaque propriété pourrait être utilisée.
UIView's frame, bounds, center, origin, when to use what?

0

méthode Il suffit d'utiliser l'a fait (la taille est nouveau) ne sera (la taille est identique était contrôleur parent)

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 

    [halfView setFrame:CGRectMake(0, 0, self.view.bounds.size.width, 120)]; 
    NSLog(@"willAnimateRotationToInterfaceOrientation"); 
    NSLog(@"self.view.bounds.size width:%f height:%f ",self.view.bounds.size.width,self.view.bounds.size.height); 
    NSLog(@"self.view.frame.size width:%f height:%f",self.view.frame.size.width,self.view.frame.size.height); 

} 
Questions connexes