Je veux modifier le anchorPoint
, mais garder la vue au même endroit. J'ai essayé NSLog
-ing self.layer.position
et self.center
ils restent tous les deux les mêmes, quelles que soient les modifications apportées à anchorPoint. Pourtant ma vue bouge!
Aucune astuce sur comment le faire?
self.layer.anchorPoint = CGPointMake(0.5, 0.5);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
self.layer.anchorPoint = CGPointMake(1, 1);
NSLog(@"center point: %f %f", self.layer.position.x, self.layer.position.y);
La sortie est:
2009-12-27 20:43:24.161 Type[11289:207] center point: 272.500000 242.500000
2009-12-27 20:43:24.162 Type[11289:207] center point: 272.500000 242.500000
la source
anchorPoint
etposition
sont liés ensemble?J'ai eu le même problème. La solution de Brad Larson a très bien fonctionné même lorsque la vue est tournée. Voici sa solution traduite en code.
Et l'équivalent rapide:
la source
La clé pour résoudre ce problème était d'utiliser la propriété frame, qui est étrangement la seule chose qui change.
Swift 2
Swift 3
Ensuite, je fais mon redimensionnement, où il se met à l'échelle du point d'ancrage. Ensuite, je dois restaurer l'ancien point d'ancrage;
Swift 2
Swift 3
EDIT: cela s'efface si la vue est tournée, car la propriété frame n'est pas définie si un CGAffineTransform a été appliqué.
la source
Pour moi, comprendre
position
etanchorPoint
c'était plus facile quand j'ai commencé à le comparer avec ma compréhension de frame.origin dans UIView. Un UIView avec frame.origin = (20,30) signifie que l'UIView est à 20 points de la gauche et à 30 points du haut de sa vue parent. Cette distance est calculée à partir de quel point d'un UIView? Il est calculé à partir du coin supérieur gauche d'un UIView.Dans le calque
anchorPoint
marque le point (sous forme normalisée, c'est-à-dire de 0 à 1) à partir duquel cette distance est calculée, par exemple layer.position = (20, 30) signifie que le calqueanchorPoint
est à 20 points de gauche et 30 points du haut de son calque parent. Par défaut, le point d'ancrage d'un calque est (0,5, 0,5), de sorte que le point de calcul de distance se trouve juste au centre du calque. La figure suivante aidera à clarifier mon point:anchorPoint
se trouve également être le point autour duquel la rotation se produira si vous appliquez une transformation au calque.la source
Il existe une solution si simple. Ceci est basé sur la réponse de Kenny. Mais au lieu d'appliquer l'ancien cadre, utilisez son origine et le nouveau pour calculer la traduction, puis appliquez cette traduction au centre. Cela fonctionne aussi avec la vue pivotée! Voici le code, beaucoup plus simple que les autres solutions:
la source
Pour ceux qui en ont besoin, voici la solution de Magnus dans Swift:
la source
view.setTranslatesAutoresizingMaskIntoConstraints(true)
. merci l'hommeview.setTranslatesAutoresizingMaskIntoConstraints(true)
est nécessaire lorsque vous utilisez des contraintes de mise en page automatique.translatesAutoresizingMaskIntoConstraints
exactement ce que je manquais, j'aurais pu apprendre maintenantVoici la réponse de user945711 ajustée pour NSView sur OS X. Outre que NSView n'a pas de
.center
propriété, le cadre de NSView ne change pas (probablement parce que NSViews n'est pas fourni avec un CALayer par défaut) mais l'origine du cadre CALayer change lorsque le point d'ancrage est modifié.la source
Si vous changez anchorPoint, sa position changera également, À MOINS QUE votre origine ne soit le point zéro
CGPointZero
.la source
Modifier et voir le point d'ancrage d'UIView à droite sur Storyboard (Swift 3)
Il s'agit d'une solution alternative qui vous permet de modifier le point d'ancrage via l'inspecteur d'attributs et qui possède une autre propriété pour afficher le point d'ancrage pour confirmation.
Créez un nouveau fichier à inclure dans votre projet
Ajouter une vue au storyboard et définir la classe personnalisée
Maintenant, définissez le nouveau point d'ancrage pour l'UIView
L'activation de Afficher le point d'ancrage affichera un point rouge afin que vous puissiez mieux voir où le point d'ancrage sera visuellement. Vous pouvez toujours le désactiver plus tard.
Cela m'a vraiment aidé lors de la planification des transformations sur UIViews.
la source
Pour Swift 3:
la source
En développant la réponse excellente et approfondie de Magnus, j'ai créé une version qui fonctionne sur les sous-couches:
la source