How do I use the NSString draw functionality to create a UIImage from text

后端 未结 4 1480
说谎
说谎 2020-11-28 02:59

I would like to draw the content of a NSString variable in a UIImage, but I have absolutely no idea how to do this. I need to write a method that w

相关标签:
4条回答
  • 2020-11-28 03:47

    Begin an image context with UIGraphicsBeginImageContext, draw to it, get an image with UIGraphicsGetImageFromCurrentImageContext, end it with UIGraphicsEndImageContext

    0 讨论(0)
  • Adding a Swift version, also gives you more 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
    }
    
    0 讨论(0)
  • 2020-11-28 03:50

    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!
    }
    

    Credit goes to Bao Lei for the beautiful answer.

    0 讨论(0)
  • 2020-11-28 04:03

    You can try this: (updated for 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;
    }
    

    To call it:

    UIImage *image = [self imageFromText:@"This is a text"];
    
    0 讨论(0)
提交回复
热议问题