Obtenir la taille de UIView après l'application de CGAffineTransform
J'ai été surpris de ne pas trouver une réponse à cette question, peut-être est quelque chose de très simple, j'ai un peu négliger :
Comment obtenir la taille réelle de une UIView après j'applique un CGAffineTransform?
par exemple.
mon UIView a la taille 300 x 200, j'applique une mise à l'échelle de transformer disons facteur 2 à la fois horizontale et verticale, de sorte que le UIView prend maintenant 600 x 400 sur l'écran, mais il est des limites et c'est la couche limites sont encore de retour d'une taille de 300 x 200 ... où puis-je trouver de la taille réelle de la UIView ?
ps. j'ai oublié de mentionner que je veux aussi faire pivoter le uiview. Si je demande seulement d'échelle CGSizeApplyAffineTransform fonctionne très bien, mais quand il y a aussi la rotation, alors il ne fonctionne pas correctement.
Edit: drawnonward m'a orienté dans la bonne direction, j'ai juste amélioré un peu le code pour compiler et c'est ici :
UIView* view = (your view being transformed);
CGAffineTransform trans = (view.transform or create a new transformation);
CGRect rect = [view bounds];
CGMutablePathRef path = CGPathCreateMutable();
rect.origin = CGPointZero;
CGPathAddRect(path , &trans , rect);
rect = CGPathGetBoundingBox( path );
CGPathRelease( path );
Maintenant rect.taille contient les dimensions de la vue avec la transformation appliquée
Merci encore à drawnonward
source d'informationauteur Marin Todorov
Vous devez vous connecter pour publier un commentaire.
[myView frame]
renvoie l'image de la vue comme on le voit par la mère, pour la disposition et la taille relative.[myView bounds]
renvoie les limites de la vue comme on le voit par lui-même, pour le dessin. Si vous avez des transformations appliquées à de multiples points de vue, vous pouvez utiliserconvertRect:
vers ou à partir d'un point de vue.Edit:
Peut-être quelque chose comme ça.
L'utilisation
[view center]
pour trouver la position dans le superview.Je l'utiliser en C Objectif:
ou Swift 4:
Utilisation
CGSizeApplyAffineTransform(size, transform)
et il sera de retour une transformée de taille. Il existe desCGPoint
etCGRect
fonctions ainsi.De plus simple: Une vue avec (limites) de la taille s à la transformation de tr est appliqué a taille:
Toutefois, si la vue superview ou d'un ancêtre point de vue a tout non-unité de transformation appliquée, cette taille n'a guère de sens dans l'absolu.
Si vous voulez, la taille absolue de la vue de la fenêtre de coordonnées après tout arbitraire transformer a été appliquée à la vue ou de son superviews, vous devez d'abord calculer l'absolu de la matrice de transformation par la composition de toute la transformation de la vue jusqu'à la racine de la fenêtre, puis appliquer la formule ci-dessus pour la suite.
Vieille question, mais croisons ici, après la recherche d'une solution et des tonnes de tentatives. Il était simple;
view.layer.frame
a toutes les transformations appliquées et vous obtiendrez la taille deview.layer.frame.size
facilement.-- ci-dessous n'est pas ici une réponse à cette question - -
Et pour mon problème, j'ai essayé de calculer de nouvelles
center
valeur après un changement delayer.anchorPoint
de ma rotation de la vue, de sorte qu'il ne bouge pas. Et enfin fait comme cela;pour inverser
enfin.
Mais d'appliquer une rotation de la transformation, il n'obtenez pas la bonne taille par CGPathGetBoundingBox.