How do I add text to an image in iOS Swift? How do I add text to an image in iOS Swift? swift swift

How do I add text to an image in iOS Swift?


Ok... I figured it out:

func textToImage(drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage{    // Setup the font specific variables    var textColor = UIColor.whiteColor()    var textFont = UIFont(name: "Helvetica Bold", size: 12)!    // Setup the image context using the passed image    let scale = UIScreen.mainScreen().scale    UIGraphicsBeginImageContextWithOptions(inImage.size, false, scale)    // Setup the font attributes that will be later used to dictate how the text should be drawn    let textFontAttributes = [        NSFontAttributeName: textFont,        NSForegroundColorAttributeName: textColor,    ]    // Put the image into a rectangle as large as the original image    inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))    // Create a point within the space that is as bit as the image    var rect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)    // Draw the text into an image    drawText.drawInRect(rect, withAttributes: textFontAttributes)    // Create a new image out of the images we have created    var newImage = UIGraphicsGetImageFromCurrentImageContext()    // End the context now that we have the image we need    UIGraphicsEndImageContext()    //Pass the image back up to the caller    return newImage}

To call it, you just pass in an image:

textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(20, 20))

The following links helped me get this straight:

Swift - Drawing text with drawInRect:withAttributes:

How to write text on image in Objective-C (iOS)?

The original goal was to create a dynamic image that I could use in an AnnotaionView such as putting a price at a given location on a map and this worked out great for it. Hope this helps someone trying to do the same thing.

For Swift 3:

 func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {    let textColor = UIColor.white    let textFont = UIFont(name: "Helvetica Bold", size: 12)!    let scale = UIScreen.main.scale    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)    let textFontAttributes = [        NSFontAttributeName: textFont,        NSForegroundColorAttributeName: textColor,        ] as [String : Any]    image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))    let rect = CGRect(origin: point, size: image.size)    text.draw(in: rect, withAttributes: textFontAttributes)    let newImage = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    return newImage! }

For Swift 4:

 func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {    let textColor = UIColor.white    let textFont = UIFont(name: "Helvetica Bold", size: 12)!    let scale = UIScreen.main.scale    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)    let textFontAttributes = [        NSAttributedStringKey.font: textFont,        NSAttributedStringKey.foregroundColor: textColor,        ] as [NSAttributedStringKey : Any]    image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))    let rect = CGRect(origin: point, size: image.size)    text.draw(in: rect, withAttributes: textFontAttributes)    let newImage = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    return newImage! }

For Swift 5:

func textToImage(drawText text: String, inImage image: UIImage, atPoint point: CGPoint) -> UIImage {    let textColor = UIColor.white    let textFont = UIFont(name: "Helvetica Bold", size: 12)!    let scale = UIScreen.main.scale    UIGraphicsBeginImageContextWithOptions(image.size, false, scale)    let textFontAttributes = [        NSAttributedString.Key.font: textFont,        NSAttributedString.Key.foregroundColor: textColor,        ] as [NSAttributedString.Key : Any]    image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))    let rect = CGRect(origin: point, size: image.size)    text.draw(in: rect, withAttributes: textFontAttributes)    let newImage = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    return newImage!}


My simple solution:

func generateImageWithText(text: String) -> UIImage? {    let image = UIImage(named: "imageWithoutText")!    let imageView = UIImageView(image: image)    imageView.backgroundColor = UIColor.clear    imageView.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)    let label = UILabel(frame: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))    label.backgroundColor = UIColor.clear    label.textAlignment = .center    label.textColor = UIColor.white    label.text = text    UIGraphicsBeginImageContextWithOptions(label.bounds.size, false, 0)    imageView.layer.render(in: UIGraphicsGetCurrentContext()!)    label.layer.render(in: UIGraphicsGetCurrentContext()!)    let imageWithText = UIGraphicsGetImageFromCurrentImageContext()    UIGraphicsEndImageContext()    return imageWithText}


You can also do a CATextLayer.

    // 1let textLayer = CATextLayer()textLayer.frame = someView.bounds// 2let string = String(  repeating: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. ",   count: 20)textLayer.string = string// 3let fontName: CFStringRef = "Noteworthy-Light"textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)// 4textLayer.foregroundColor = UIColor.darkGray.cgColortextLayer.isWrapped = truetextLayer.alignmentMode = kCAAlignmentLefttextLayer.contentsScale = UIScreen.main.scalesomeView.layer.addSublayer(textLayer)

https://www.raywenderlich.com/402-calayer-tutorial-for-ios-getting-started