Je voudrais dessiner le contenu d'une variable dans un UIImage
, mais je n'ai absolument aucune idée de comment faire cela. J'ai besoin d'écrire une méthode qui recevra un NSString
comme paramètre et retournera un UIImage
avec le texte dessiné dedans.Comment puis-je utiliser la fonctionnalité de dessin NSString pour créer un UIImage à partir du texte
Répondre
Vous pouvez essayer ceci: (mis à jour pour iOS 4)
-(UIImage *)imageFromText:(NSString *)text
{
// set the font type and size
UIFont *font = [UIFont systemFontOfSize:20.0];
CGSize size = [text sizeWithFont:font];
// check if UIGraphicsBeginImageContextWithOptions is available (iOS is 4.0+)
if (UIGraphicsBeginImageContextWithOptions != NULL)
UIGraphicsBeginImageContextWithOptions(size,NO,0.0);
else
// iOS is < 4.0
UIGraphicsBeginImageContext(size);
// optional: add a shadow, to avoid clipping the shadow you should make the context size bigger
//
// CGContextRef ctx = UIGraphicsGetCurrentContext();
// CGContextSetShadowWithColor(ctx, CGSizeMake(1.0, 1.0), 5.0, [[UIColor grayColor] CGColor]);
// draw in context, you can use also drawInRect:withFont:
[text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font];
// transfer image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
Pour appeler :
UIImage *image = [self imageFromText:@"This is a text"];
Begin un contexte d'image avec UIGraphicsBeginImageContext
, attirer, obtenir une image avec UIGraphicsGetImageFromCurrentImageContext
, fin avec UIGraphicsEndImageContext
Comment dessiner le NSString? C'était ce que je demandais. S'IL VOUS PLAÎT! – Jaba
Regardez NSString UIKit Additions - il existe plusieurs fonctions de dessin nsstring disponibles - comme 'drawAtPoint: withFont:' ou 'drawInRect: withFont:' et d'autres – Vladimir
@Jaba: regardez 'CGContextShowTextAtPoint' et les fonctions connexes. –
Ajout d'une version Swift, vous donne également plus d'options:
class func sizeOfAttributeString(str: NSAttributedString, maxWidth: CGFloat) -> CGSize {
let size = str.boundingRectWithSize(CGSizeMake(maxWidth, 1000), options:(NSStringDrawingOptions.UsesLineFragmentOrigin), context:nil).size
return size
}
class func imageFromText(text:NSString, font:UIFont, maxWidth:CGFloat, color:UIColor) -> UIImage {
let paragraph = NSMutableParagraphStyle()
paragraph.lineBreakMode = NSLineBreakMode.ByWordWrapping
paragraph.alignment = .Center // potentially this can be an input param too, but i guess in most use cases we want center align
let attributedString = NSAttributedString(string: text, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: color, NSParagraphStyleAttributeName:paragraph])
let size = sizeOfAttributeString(attributedString, maxWidth: maxWidth)
UIGraphicsBeginImageContextWithOptions(size, false , 0.0)
attributedString.drawInRect(CGRectMake(0, 0, size.width, size.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
Swift 3,1
func sizeOfAttributeString(str: NSAttributedString, maxWidth: CGFloat) -> CGSize {
let size = str.boundingRect(with: CGSize(width: maxWidth, height: 1000), options:(NSStringDrawingOptions.usesLineFragmentOrigin), context:nil).size
return size
}
func imageFromText(text:NSString, font:UIFont, maxWidth:CGFloat, color:UIColor) -> UIImage {
let paragraph = NSMutableParagraphStyle()
paragraph.lineBreakMode = NSLineBreakMode.byWordWrapping
paragraph.alignment = .center
let attributedString = NSAttributedString(string: text as String, attributes: [NSFontAttributeName: font, NSForegroundColorAttributeName: color, NSParagraphStyleAttributeName:paragraph])
let size = sizeOfAttributeString(str: attributedString, maxWidth: maxWidth)
UIGraphicsBeginImageContextWithOptions(size, false , 0.0)
attributedString.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
Le crédit va à Bao Lei pour la belle réponse.
pour iOS4 + vous devez créer le contexte avec la mise à l'échelle 0.0 pour obtenir la mise à l'échelle de l'écran principal si la mise à l'échelle n'est pas 1.0 (affichage rétine est 2.0): \t UIGraphicsBeginImageContextWithOptions (size, NO, 0.0); – valexa
@rpmx caractères d'échappement comme \ n nouvelle ligne ne sont pas détectés ?? – Yadnesh
@Yadnesh: Utiliser: [texte drawInRect: (CGRect) rect withFont: (police UIFont *)]; – rpmx