Ok ... ich habe es herausgefunden:
func textToImage(drawText: NSString, inImage: UIImage, atPoint: CGPoint) -> UIImage{
var textColor = UIColor.whiteColor()
var textFont = UIFont(name: "Helvetica Bold", size: 12)!
let scale = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(inImage.size, false, scale)
let textFontAttributes = [
NSFontAttributeName: textFont,
NSForegroundColorAttributeName: textColor,
]
inImage.drawInRect(CGRectMake(0, 0, inImage.size.width, inImage.size.height))
var rect = CGRectMake(atPoint.x, atPoint.y, inImage.size.width, inImage.size.height)
drawText.drawInRect(rect, withAttributes: textFontAttributes)
var newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
Um es zu nennen, geben Sie einfach ein Bild ein:
textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(20, 20))
Die folgenden Links haben mir dabei geholfen, das klar zu stellen:
Swift - Zeichnen von Text mit drawInRect: withAttributes:
Wie schreibe ich Text auf ein Bild in Objective-C (iOS)?
Das ursprüngliche Ziel war es, ein dynamisches Bild zu erstellen, das ich verwenden kann, um AnnotaionView
beispielsweise einen Preis an einem bestimmten Ort auf einer Karte zu platzieren, und das hat sich hervorragend bewährt. Hoffe, das hilft jemandem, der versucht, das Gleiche zu tun.
Für 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!
}
Für 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!
}
Für 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!
}
Meine einfache Lösung:
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 }
quelle
Sie können auch einen CATextLayer erstellen.
// 1 let textLayer = CATextLayer() textLayer.frame = someView.bounds // 2 let string = String( repeating: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor arcu quis velit congue dictum. ", count: 20 ) textLayer.string = string // 3 let fontName: CFStringRef = "Noteworthy-Light" textLayer.font = CTFontCreateWithName(fontName, fontSize, nil) // 4 textLayer.foregroundColor = UIColor.darkGray.cgColor textLayer.isWrapped = true textLayer.alignmentMode = kCAAlignmentLeft textLayer.contentsScale = UIScreen.main.scale someView.layer.addSublayer(textLayer)
https://www.raywenderlich.com/402-calayer-tutorial-for-ios-getting-started
quelle
Ich habe eine Erweiterung für die Verwendung überall erstellt:
import Foundation import UIKit extension UIImage { class func createImageWithLabelOverlay(label: UILabel,imageSize: CGSize, image: UIImage) -> UIImage { UIGraphicsBeginImageContextWithOptions(CGSize(width: imageSize.width, height: imageSize.height), false, 2.0) let currentView = UIView.init(frame: CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height)) let currentImage = UIImageView.init(image: image) currentImage.frame = CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height) currentView.addSubview(currentImage) currentView.addSubview(label) currentView.layer.render(in: UIGraphicsGetCurrentContext()!) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img! } }
Verwendung: Überall auf Ihrem ViewController, wo Sie die Größe und das Etikett zum Hinzufügen haben, verwenden Sie es wie folgt:
let newImageWithOverlay = UIImage.createImageWithLabelOverlay(label: labelToAdd, imageSize: size, image: editedImage)
quelle
Für schnelle 4:
func textToImage(drawText text: NSString, inImage image: UIImage, atPoint point: CGPoint) -> UIImage { let scale = UIScreen.main.scale UIGraphicsBeginImageContextWithOptions(image.size, false, scale) image.draw(in: CGRect(origin: CGPoint.zero, size: image.size)) let rect = CGRect(origin: point, size: image.size) let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.alignment = .center let attrs = [NSAttributedStringKey.font: UIFont(name: "Helvetica Bold", size: 12)!,NSAttributedStringKey.foregroundColor : UIColor.white , NSAttributedStringKey.paragraphStyle: paragraphStyle] text.draw(with: rect, options: .usesLineFragmentOrigin, attributes: attrs, context: nil) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! }
quelle
Ich kann in Ihrer ersten Frage nichts sehen, was darauf hindeutet, dass dies ausschließlich im Code erfolgen muss. Warum also nicht einfach ein UILabel im Interface Builder hinzufügen und Einschränkungen hinzufügen, um ihm die gleiche Länge und Breite wie Ihrem Bild zu geben, es vertikal zu zentrieren und horizontal (oder wie auch immer Sie es platzieren möchten), löschen Sie den Beschriftungstext, stellen Sie die Schriftart, Größe, Farbe usw. des Textes nach Bedarf ein (einschließlich Aktivieren von Autoshrink mit der von Ihnen benötigten Mindestgröße oder -skala) und stellen Sie sicher, dass der Hintergrund transparent ist.
Verbinden Sie es dann einfach mit einem IBOutlet und legen Sie den Text nach Bedarf im Code fest (z. B. in viewWillAppear oder mithilfe eines ViewModel-Ansatzes und Festlegen bei der Initialisierung Ihrer Ansicht / Ihres Viewcontrollers).
quelle
Ich habe diese Grundkomponenten ausprobiert. Hoffe es wird funktionieren.
func imageWithText(image : UIImage, text : String) -> UIImage { let outerView = UIView(frame: CGRect(x: 0, y: 0, width: image.size.width / 2, height: image.size.height / 2)) let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: outerView.frame.width, height: outerView.frame.height)) imgView.image = image outerView.addSubview(imgView) let lbl = UILabel(frame: CGRect(x: 5, y: 5, width: outerView.frame.width, height: 200)) lbl.font = UIFont(name: "HelveticaNeue-Bold", size: 70) lbl.text = text lbl.textAlignment = .left lbl.textColor = UIColor.blue outerView.addSubview(lbl) let renderer = UIGraphicsImageRenderer(size: outerView.bounds.size) let convertedImage = renderer.image { ctx in outerView.drawHierarchy(in: outerView.bounds, afterScreenUpdates: true) } return convertedImage }
quelle