2010-06-18 6 views
1

J'utilise ce qui suit pour redimensionner et repositionner un calque UIView lorsque l'appareil passe en mode paysage.Problème Transformation.Translation à la rotation

[containerView.layer setValue:[NSNumber numberWithFloat: 0] forKeyPath: @"transform.translation.x"]; 
[containerView.layer setValue:[NSNumber numberWithFloat: 0] forKeyPath: @"transform.translation.y"];  
[containerView.layer setValue:[NSNumber numberWithFloat: 1] forKeyPath: @"transform.scale.x"]; //[NSNumber numberWithInt:1] 
[containerView.layer setValue:[NSNumber numberWithFloat: 1] forKeyPath: @"transform.scale.y"]; 

puis le folowing lors de la rotation retour au portrait

[containerView.layer setValue:[NSNumber numberWithFloat: -75] forKeyPath: @"transform.translation.x"]; 
[containerView.layer setValue:[NSNumber numberWithFloat: 0] forKeyPath: @"transform.translation.y"];  
[containerView.layer setValue:[NSNumber numberWithFloat: .7] forKeyPath: @"transform.scale.x"]; //[NSNumber numberWithInt:1] 
[containerView.layer setValue:[NSNumber numberWithFloat: .7] forKeyPath: @"transform.scale.y"]; 

Le problème est que, après Rotaing retour au portrait, la couche est « en déplacement » ie x, y décalage changent progressivement (en augmentant x, décroissant y). Échelle semble bien (c'est-à-dire ne pas incrémenter, décrémenter sur les rotations répétées)

Quelqu'un peut-il suggérer une bonne solution?

+0

Si je retire la balance en mode portrait, le problème disparaît, donc je pense que peut-être l'ordre est important. et ou dois-je séparer les opérations de transalte et d'échelle en méthodes séparées? –

+0

Il est possible que la commande ait de l'importance. Essayez de mettre les opérations d'échelle après les traductions. – JAB

Répondre

0

Peut-être est-ce dû aux erreurs d'arrondi en virgule flottante qui sont présentes dans toutes les implémentations de nombres à virgule flottante dans une certaine mesure? Bien que si c'est le cas, votre meilleur pari peut être juste de faire une sorte de troncature ou d'arrondi quelque part dans votre code.

EDIT: Essayez de faire quelque chose comme l'utilisation d'une traduction x plus petite sur le retour de la transformation, ou en utilisant une traduction x positive et une traduction y non nulle. En fait, si la quantité qui est en cours de traduction reste la même à chaque fois, c'est probablement quelque chose à voir avec les traductions que vous lui donnez. Vous pouvez surcompenser pour tout ce qui a nécessité la traduction en premier lieu, ce qui pourrait être la source du problème.

+0

pas le décalage avec chaque rotation vers portrait est beaucoup beaucoup plus qu'une erreur à virgule flottante –

+0

@echo_bach: Je vois, alors. Retravailler ma réponse. – JAB