2010-05-02 6 views
6

C'est tout à fait l'iPhone quandry. Je travaille sur une bibliothèque, mais j'ai réduit mon problème au code très simple. Ce code crée une vue 50x50, applique une transformation de rotation de quelques degrés, puis décale le cadre plusieurs fois. Le résultat est que la vue 50x50 est maintenant beaucoup plus grande.Faire pivoter à l'aide d'une transformation, puis modifier l'origine du cadre et agrandir la vue?

Voici le code:

// a simple 50x50 view 
UIView *redThing = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)]; 
redThing.backgroundColor = [UIColor redColor]; 

[self.view addSubview:redThing]; 

// rotate a small amount (as long as it's not 90 or 180, etc.) 
redThing.transform = CGAffineTransformRotate(redThing.transform, 0.1234); 

// move the view down 2 pixels 
CGRect newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height); 
redThing.frame = newFrame; 

// move the view down another 2 pixels 
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height); 
redThing.frame = newFrame; 

// move the view down another 2 pixels 
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height); 
redThing.frame = newFrame; 

// move the view down another 2 pixels 
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height); 
redThing.frame = newFrame; 

Alors, que diable se passe? Maintenant, si je déplace la vue en appliquant une transformation de traduction, cela fonctionne très bien. Mais ce n'est pas ce que je veux faire et ce devrait fonctionner de toute façon.

Des idées?

+0

Peut-être que la transformation est appliquée après les quarts de travail? – Artelius

Répondre

14

De la documentation UIView:

Si la transformation de la propriété est également définie, utilisez les limites et les propriétés du centre au lieu; sinon, l'animation des modifications apportées à la propriété frame ne reflète pas correctement l'emplacement réel de la vue.

Avertissement: Si la propriété transform n'est pas la transformation d'identité, la valeur de cette propriété est indéfinie et doit donc être ignorée.

En d'autres termes, je me méfie de la propriété frame lorsqu'un transform est réglé.

+1

Wow. Merci ... n'a pas vu ça dans les docs. Surprenant. – ZaBlanc

+0

@ZaBlanc, si c'est la bonne réponse, vous devriez le marquer comme tel. –

+0

Terminé. Je viens d'apprendre il y a 5 minutes à propos de la coche. Je me rattrape sur tous mes anciens posts maintenant. ;-) – ZaBlanc