J'ai besoin de dessiner du texte centré sur un CGContext.
J'ai commencé avec une approche de cacao. J'ai créé un nscell avec le texte et j'ai essayé de le dessiner ainsi: p> mais le cgbitmapcontext ne semble pas avoir le texte rendu. Peut-être parce que je dois passer nil pour le paramètre Siview: Paramètre. P> J'ai donc essayé de changer de texte Rendu sur les graphiques principaux: P> Le moyen le plus simple semble être d'utiliser CGContextselectfont pour sélectionner une police Utilisation de son nom PostScript et de la taille des points, mais CGContexTShowtextatPoint ne prend que des caractères non unicode, et il n'y a pas de moyen apparent d'adapter le texte à un rectangle: ou de calculer les étendons d'une ligne de texte pour établir manuellement le rectangle. < / P> Ensuite, il existe une CGFONT qui peut être créée et définir CIA CGContextsetFont. Dessiner ce texte nécessite CGContexTShowglyPointPoint, mais à nouveau, le CGContext semble manquer de fonctions pour calculer le nouveau texte généré ou pour envelopper le texte dans un record. Plus comment transformer une chaîne à un tableau de CGGLYPHS n'est pas évident. P> L'option suivante consiste à essayer d'utiliser CareText pour rendre la chaîne. Mais les classes de texte de base sont extrêmement compliquées et, bien qu'il y ait des échantillons qui montrent comment afficher le texte, dans une police spécifiée, dans un record, aucun échantillon ne montre comment calculer le record de bordure d'une chaîne de corsetext. P> SO: P>
3 Réponses :
Je continuerais avec votre approche ci-dessus, mais utilisez plutôt Nsattributedstring à la place.
NSGraphicsContext* newCtx = [NSGraphicsContext graphicsContextWithGraphicsPort:bitmapContext flipped:true]; [NSGraphicsContext saveGraphicsState]; [NSGraphicsContext setCurrentContext:newCtx]; NSAttributedString *string = /* make a string with all of the desired attributes */; [string drawInRect:locationToDraw]; [NSGraphicsContext restoreGraphicsState];
Comment NsgraphicsContext et les API alignées que vous utilisez sont compatibles avec CGContext et ses propres API? Pourriez-vous être mélangé? Mon code fait partie du SDK multi-plateformes qui devrait exécuter à la fois iOS MacOS, etc., et donc je me limite aux API de CoreGraphics - pourriez-vous améliorer votre réponse pour travailler sur un CGBITMAPContext?
J'ai finalement réussi à trouver des réponses après 4 jours de recherche. Je souhaite vraiment que Apple fait une meilleure documentation. Alors, nous allons
Je suppose que vous avez déjà CGFontref avec vous. Si vous ne le faites pas savoir, je vous dirai comment vous dira comment charger un TTF à partir d'un ensemble de ressources dans CGFontref. P>
ci-dessous est l'extrait de code pour calculer les limites de n'importe quelle chaîne avec n'importe quel CGFontref P>
int charCount = [string length]; CGGlyph glyphs[charCount]; CGRect rects[charCount]; CTFontGetGlyphsForCharacters(theCTFont, (const unichar*)[string cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, charCount); CTFontGetBoundingRectsForGlyphs(theCTFont, kCTFontDefaultOrientation, glyphs, rects, charCount); int totalwidth = 0, maxheight = 0; for (int i=0; i < charCount; i++) { totalwidth += rects[i].size.width; maxheight = maxheight < rects[i].size.height ? rects[i].size.height : maxheight; } dim = CGSizeMake(totalwidth, maxheight);
Mais vous avez laissé la réponse réelle ... Comment dessiner réellement ce texte dans la section ... Le code de votre question utilise des API AppKit (NS) et votre question (et ma condition ...) est de dessiner du texte sur CGBITMAPCONText, en utilisant uniquement des API Coregraphics (afin d'être cross iOS / MacOS). Pourriez-vous développer un peu un peu?
SWIFT 5 Version! strong> let targetSize: CGSize = // the space you have available for drawing the text
let origin: CGPoint = // where you want to position the top-left corner
let string: String = // your string
let font: UIFont = // your font
let attrs: [NSAttributedString.Key:Any] = [.font: font]
let boundingRect = string.boundingRect(with: targetSize, options: [.usesLineFragmentOrigin], attributes: attrs, context: nil)
let textRect = CGRect(origin: origin, size: boundingRect.size)
text.draw(with: textRect, options: [.usesLineFragmentOrigin], attributes: attrs, context: nil)
Pourriez-vous dessiner un exemple de résultat souhaité?
Peut-être, mais le résultat souhaité est reslly simple - je veux dessiner une chaîne, avec une police (taille et taille) dans un rect. La chaîne doit être enveloppée et je dois être capable de choisir si les lignes sont laissées, moyennes ou droites alignées, ainsi que le paragraphe d'être supérieur, centre ou inférieur aligné.