Ecrire dans une vue ????
Jennifer75a
Membre
Bonjour,
Apple écrit se code :
void MyDrawText (CGContextRef myContext, CGRect contextRect) // 1
{
float w, h;
w = contextRect.size.width;
h = contextRect.size.height;
CGAffineTransform myTextTransform; // 2
CGContextSelectFont (myContext, // 3
"Times-Bold",
h/10,
kCGEncodingMacRoman);
CGContextSetCharacterSpacing (myContext, 10); // 4
CGContextSetTextDrawingMode (myContext, kCGTextFillStroke);
CGContextSetRGBFillColor (myContext, 0, 1, 0, .5); // 6
CGContextSetRGBStrokeColor (myContext, 0, 0, 1, 1); // 7
myTextTransform = CGAffineTransformMakeRotation (0); // 8
CGContextSetTextMatrix (myContext, myTextTransform); // 9
CGContextShowTextAtPoint (myContext, 40, 0, "Quartz 2D", 9); // 10
}
pour CGRect contextRect, c'est ok
MAIS pour myContext, il est nul ??? je le crée par CGContextRef myContext = UIGraphicsGetCurrentContext(); par il est nul
Merci de votre aide
Jennifer
Apple écrit se code :
void MyDrawText (CGContextRef myContext, CGRect contextRect) // 1
{
float w, h;
w = contextRect.size.width;
h = contextRect.size.height;
CGAffineTransform myTextTransform; // 2
CGContextSelectFont (myContext, // 3
"Times-Bold",
h/10,
kCGEncodingMacRoman);
CGContextSetCharacterSpacing (myContext, 10); // 4
CGContextSetTextDrawingMode (myContext, kCGTextFillStroke);
CGContextSetRGBFillColor (myContext, 0, 1, 0, .5); // 6
CGContextSetRGBStrokeColor (myContext, 0, 0, 1, 1); // 7
myTextTransform = CGAffineTransformMakeRotation (0); // 8
CGContextSetTextMatrix (myContext, myTextTransform); // 9
CGContextShowTextAtPoint (myContext, 40, 0, "Quartz 2D", 9); // 10
}
pour CGRect contextRect, c'est ok
MAIS pour myContext, il est nul ??? je le crée par CGContextRef myContext = UIGraphicsGetCurrentContext(); par il est nul
Merci de votre aide
Jennifer
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
-(void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSelectFont (ctx, "Times-Bold", 10, kCGEncodingMacRoman);
CGContextSetCharacterSpacing (ctx, 10);
CGContextSetTextDrawingMode (ctx, kCGTextFillStroke);
CGContextSetRGBFillColor (ctx, 0, 1, 0, .5);
CGContextSetRGBStrokeColor (ctx, 0, 0, 1, 1);
CGContextShowTextAtPoint (ctx, 40, 0, "Quartz 2D", 9);
}
Merci de votre aide
Jennifer
j'ai trouvé
Je vais faire un tuto sur mon site
http://web.me.com/jennifer.aubinais/
Bon week-end
Jennifer
Les NSString (UIKit Addition) fournissent un certain nombre de méthodes commençant par drawAtPoint et par drawInRect:
2) Pour utiliser directement Core Graphics,
Un petit piège : le texte est à l'envers. On utilise la matrice de rotation.
Dès lors un ajustement sur l'ordonnée du point origine s'avère nécessaire.
Ton code ne marchait pas car la police "Times-Bold" n'est pas utilisable sous iPhone.
J'ai créé une vue et je voudrais également écrire dedans.
J'arrive à écrire des choses simples avec CoreGraphics (je fais mes débuts avec cette API).
Je souhaiterais maintenant appliquer une rotation autour d'un centre pour le texte que j'écris (une série de strings).
J'ai réussi à faire ces choses là auparavant avec des UILabels et leurs layers, mais question perfs c'est très moyen. Je suis donc passé à CoreGraphics...
Donc j'ai une frame de 400 pixels de côté (0,0,400,400).
Je veux faire graviter du texte autour de cette frame mais j'ai du mal à positionner ces éléments en rotation car la méthode CGContextShowTextAtPoint (ctx, startText.x, startText.y, text, length) permet de placer du texte à un point, sauf que je voudrais faire une rotation autour du point ancre situé à 200,200... au coeur de la frame, alors que le texte initial est situé en 380, 200 par exemple.
Avec les layers et les anchors points, c'était très facile. Mais là je sèche. Il n'y a pas de méthode équivalente à drawInRect en CG ? Et une autre pour positionner un point d'origine pour faire la rotation ?
Je n'ai pas su me dépatouiller avec : CGAffineTransformMakeRotation(newPos);
CGContextRotateCTM(ctx, newPos);
Sinon il faut que tu joues sur les CGAffineTransform pour positionner ton texte, en composant les différentes transformation (sans doute une translation pour amener le centre de ta NSString au centre de ta vue, puis la rotation, puis re une translation pour repositionner ta NSString rotationnée au bon endroit)... en composant dans le bon sens, on finit par y arriver (après plusieurs tâtonnements en général :P)
Bon, j'ai fait des maths toute la jour née un peu le tour aux autres non ? ;D
@ philippe, boudiou c'est bien confus... je n'arrive pas à modifier ta base pour en faire ce que je veux.
Je cherche l'équivalent de ceci (qui marche super bien, mais qui rame au chargement car 64 layers !) :
C'est donc pour obtenir un cercle de chiffres autour d'une roue...
[EDIT] Hurks, j'avios pas mis la bonme photo !
[move] :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): :fouf): [/move]
Je fais mes modifs et je te dis ça... héhé
Meci à toi en tout cas !!!
Note la bidouille si j'ai 2 cars à afficher au lieu d'un... doit sûrement y avoir plus propre !
En tout cas, je te remercie. Il me semble que c'est plus fluide maintenant. Surtout que cette vue est destinée à tourner...
Un grand merci pour ton aide !
Curieux , j'ai pris la moitié de la largeur du texte. Le centre de la rotation du texte peut-être ?
Quel effet cela donnait-il avec 2 caractères ?
Ce ne serait pas plus fluide avec une image définie soit en ressource, soit enregistrée une fois pour toutes par du code , plutôt que de la redessiner à chaque fois ?
2) Oui j'ai une image de fond sur laquelle je greffe cette vue. Mais comme je n'ai pas trouvé un bon logiciel capable de faire des rotations de texte au centième de degré (5,625° par chiffre dans mon cas), je le fais pas programmation pour plus de précision. Photoshop s'arrête aux dizièmes par exemple. De plus c'est moin galère à placer, et au final, j'ai fait mes début avec CG...
Il faut sans doute rentrer plus à fond dans la métrique des fonts pour faire le calcul exact , cf l'instruction
CGContextShowTextAtPoint (ctx, startText.x, startText.y+[font ascender], "Quartz",6);
que j'avais du mettre plus haut pour bien insérer le texte dans le rectangle après la symétrie verticale. A améliorer donc ...
Je pensais à dessiner le motif sur une image vierge une fois pour toutes par le code, puis à faire tourner cette image ensuite.
Je reviendrais dessus après release de l'application.
Ah, ok, oui c'est une solution, ça m'apprendrait à "burner" une image.
D'ailleurs, sans transition, l'image actuelle est appellée par un viewController lors d'un push navigation controller, sauf que comme l'image est placée en X à - 200 pixels, elle déborde sur la vue du navigation controller précédent lors de l'appel. Ce n'est pas un bug, c'est tout simplement logique, je dirai que ça a son charme... je pense que je pourrais à la limite tronquer l'image lors du chargement, et recharger l'image entière lorsque je m'en sers dans la vue courante.