2014-06-09 4 views
1

Dites que vous voulez que le texte se lève vers le haut. Bien sûr, il est facile de le faire pivoter 90degrees:Le moyen le plus élégant de faire pivoter un UILabel; maintenir le coin inférieur gauche

someUIView.transform = CGAffineTransformMakeRotation(- 90.0f * M_PI/180.0f); 

Mais en général, vous voulez qu'il MAINTENIR LE BAS GAUCHE COIN

Ainsi, la position dans storyboard IB vous le texte (horizontal) où vous voulez le coin inférieur gauche être, et vous vous attendez à ce que lorsque l'application est en cours d'exécution, et le texte est vertical, c'est où "nouveau" coin inférieur gauche du texte vertical sera.

enter image description here

est ici une catégorie sur UIView ...

-(void)standOnBottomLeftCorner 
    { 
    CGPoint org = self.frame.origin; 
    org.y += self.frame.size.height; 
    self.transform = CGAffineTransformMakeRotation(- 90.0f * M_PI/180.0f); 
    CGRect nu = self.frame; 
    nu.origin = org; 
    nu.origin.y -= nu.size.height; 
    self.frame = nu; 
    } 

Cependant, note:

JRT explique: « Vous ne devez pas définir le cadre sur une vue transformé, il est comportement indéfini. "

Sauf si je suis bourré, ça marche ... mais quelle est la meilleure façon?


Cette idée illustrations très intelligent de Matic show:

enter image description here

+3

Ce que vous cherchez le plus, c'est .layer.anchorPoint –

+0

Astuce brillante, merci - mais FWIW ça ne tourne pas vraiment autour d'un point (je ne pense pas?) Voir diagramme! – Fattie

+1

Ce point semble être (height/width * .5f, .5f) au lieu de (.0f, 1.0f). –

Répondre

8

Modification du point d'ancrage de la couche modifiera le point qui transforme le travail autour.

Dans votre cas, vous souhaitez définir le point d'ancrage à mi-chemin de l'étiquette et la moitié de la hauteur depuis le côté gauche, comme l'a souligné Matic:

CGRect frame = self.frame; 
self.layer.anchorPoint = CGPointMake((frame.size.height/frame.size.width * 0.5),0.5); // Anchor points are in unit space 
self.frame = frame; // Moving the anchor point moves the layer's position, this is a simple way to re-set 
CGAffineTransform rotate = CGAffineTransformMakeRotation(- 90.0f * M_PI/180.0f); // Performs the rotation 
self.transform = rotate; 

Terminé. Vous ne devez pas définir le cadre sur une vue transformée, c'est un comportement indéfini.

+0

Ah! Je suppose que vous le déplaceriez juste vers la droite, par la largeur du nouvel objet droit. Ou peut-être puisque vous dites ".. cadre sur une vue transformée, c'est un comportement indéfini .." peut-être qu'il serait préférable d'utiliser la hauteur de l'original? – Fattie

+0

Astuce génial que ma fonction suggérée n'est pas bonne, car il est en train de définir un cadre transformé, merci – Fattie

+0

Oh, je pense que j'ai manqué un peu. Vous voulez que le bas à gauche soit en bas à gauche du point de vue du spectateur, pas le texte. Vous devez également ajouter une transformation supplémentaire dans ce cas. Je vais mettre à jour la réponse. – jrturton

Questions connexes