Supposons que j'aie une petite UIView en tant qu'enfant/sous-vue d'une UIView plus grande, et que cet enfant puisse être déplacé via des CGAffineTransforms. Comment le parent pourrait-il savoir quel est le véritable "centre" de cette vue dans son propre système de coordonnées ? J'ai essayé d'utiliser les routines convertPoint avec ce qui est renvoyé par child.center, mais cela ne fonctionne pas... le "centre" est-il complètement faux dans ce contexte ou est-ce que j'utilise simplement la mauvaise méthode ?
Réponse
Trop de publicités?EDIT :
Après avoir effectué quelques tests, j'ai constaté ce qui suit :
Les UIViews n'ont pas de propriété anchorPoint, mais ils ont une propriété center. La propriété de centre est toujours calculée correctement après l'application de transformations, à l'exception d'une transformation de translation, pour laquelle vous devez procéder comme suit :
CGPoint realCenter = CGPointMake(myView.center.x + myView.frame.origin.x, ...);
Quant à CALayer
ils ont bien une propriété anchorPoint, mais pas de propriété center. Vous devez donc calculer le centre manuellement en effectuant des calculs sur la propriété position, la propriété anchorPoint et la translation de votre couche.
Je ne peux pas fournir de code, car je ne suis pas sûr de la méthode que vous utilisez, mais pour résumer, vous devez déployer votre propre calculateur central dans les deux cas.
Veuillez regarder attentivement les images ci-dessous (avec l'aimable autorisation des diapositives du cours de développement d'iPhone de Stanford) :
Avant d'appliquer toute rotation :
Après avoir appliqué une rotation de 45° :
Conclusion :
Remarquez que l'ancien centre était (300, 225) et que le nouveau centre est, eh bien pas nouveau ! C'est le même. Si vous faites tout correctement, votre centre devrait être le même. Si vous avez un autre point dans la vue que vous souhaitez calculer, vous devez le faire vous-même.
Remarquez également comment le cadre est passé de (200, 100, 200, 250) à (140, 65, 320, 320). C'est ainsi que UIKit fait sa magie.