【问题标题】:How do I use the NSString draw functionality to create a UIImage from text如何使用 NSString 绘制功能从文本创建 UIImage
【发布时间】:2011-02-15 11:17:27
【问题描述】:

我想在UIImage 中绘制NSString 变量的内容,但我完全不知道该怎么做。我需要编写一个方法来接收NSString 作为参数并返回一个UIImage 并在其中绘制文本。

【问题讨论】:

    标签: iphone nsstring uiimage


    【解决方案1】:

    斯威夫特 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!
    }
    

    感谢鲍磊的精彩回答。

    【讨论】:

      【解决方案2】:

      添加 Swift 版本,也为您提供更多选择:

      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
      }
      

      【讨论】:

        【解决方案3】:

        你可以试试这个:(为 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;
        }
        

        称呼它:

        UIImage *image = [self imageFromText:@"This is a text"];
        

        【讨论】:

        • 对于 iOS4+,您应该创建缩放为 0.0 的上下文,以便在缩放不是 1.0(视网膜显示为 2.0)时获得主屏幕的缩放:UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
        • @rpmx 转义字符,如 \n 新行没有被检测到??
        • @Yadnesh: 使用:[text drawInRect:(CGRect)rect withFont:(UIFont *)font] ;
        • @PsychoDad 您在 [text drawAtPoint] 行之前的 UIColor 上调用 -set。像这样:[[UIColor redColor] set];
        • rpmx -- 很好的答案。感谢分享。对于找到此页面并针对 iOS 7 的任何人,请注意 drawAtPoint:withFont 方法已被弃用。所以你需要对上面的代码做一个小的调整——改变这个:[text drawAtPoint:CGPointMake(0.0, 0.0) withFont:font];为此:[text drawAtPoint:CGPointMake(1.0, 8.0) withAttributes:@{NSFontAttributeName:font}];
        【解决方案4】:

        UIGraphicsBeginImageContext 开始图像上下文,绘制到它,以UIGraphicsGetImageFromCurrentImageContext 获取图像,以UIGraphicsEndImageContext 结束它

        【讨论】:

        • 如何将 NSString 绘制到它上面?这就是我要问的。请!
        • 查看 NSString UIKit Additions - 有多个 nsstring 绘图函数可用 - 例如 'drawAtPoint:withFont:' 或 'drawInRect:withFont:' 等
        • @Jaba:看CGContextShowTextAtPoint及相关函数。
        • 非常感谢,我会研究一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 2021-08-26
        相关资源
        最近更新 更多