使用swift在图像上叠加文本

我试图使用Swift在图像上叠加一些文本,我在这里查看这段代码:(src: 如何在iOS Swift中向图像添加文本 )

这会将文本放在中心位置。 我一直在改变价值观

var rect = CGRectMake(10,150, inImage.size.width, inImage.size.height) 

但是我无法在左下角显示文字。 有人可以帮助并展示我在这里缺少的东西吗?

我正在使用以下行添加修改后的图像:

 modImage = self.textToImage("000", inImage: UIImage(named:"thisImage.png")!, atPoint: CGPointMake(10, 400)) 

以下是function……

 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 } 

细节

xCode 9.1,Swift 4

扩展UIView

 extension UIView { func copyObject () -> T? { let archivedData = NSKeyedArchiver.archivedData(withRootObject: self) return NSKeyedUnarchiver.unarchiveObject(with: archivedData) as? T } } 

扩展UIImage

  extension UIImage { typealias EditSubviewClosure = (_ parentSize: CGSize, _ viewToAdd: T)->() func with(view: T, editSubviewClosure: EditSubviewClosure) -> UIImage { if let copiedView = view.copyObject() as? T { UIGraphicsBeginImageContext(size) let basicSize = CGRect(origin: .zero, size: size) draw(in: basicSize) editSubviewClosure(size, copiedView) copiedView.draw(basicSize) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } return self } } 

扩展UIImageView

  extension UIImageView { enum ImageAddingMode { case changeOriginalImage case addSubview case addCopiedSubview } func drawOnCurrentImage(view: T, mode: ImageAddingMode, editSubviewClosure: @escaping UIImage.EditSubviewClosure) { guard let image = image else { return } let addSubView: (T) -> () = { view in editSubviewClosure(self.frame.size, view) self.addSubview(view) } switch mode { case .changeOriginalImage: self.image = image.with(view: view, editSubviewClosure: editSubviewClosure) case .addSubview: addSubView(view) case .addCopiedSubview: if let copiedView = view.copyObject() as? T { addSubView(copiedView) } } } } 

用法

样品1

 func sample1(label: UILabel) { imageView.contentMode = .scaleAspectFit imageView.image = UIImage(named: "wall")?.with(view: label) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 40) viewToAdd.textColor = .yellow viewToAdd.bounds = CGRect(x: 40, y: 40, width: 200, height: 40) } } 

在此处输入图像描述

样本2

 func sample2(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFit imageView.drawOnCurrentImage(view: label, mode: .changeOriginalImage) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 40) viewToAdd.textColor = .yellow viewToAdd.textAlignment = .right let width: CGFloat = 200 let height: CGFloat = 30 let indent: CGFloat = 40 viewToAdd.bounds = CGRect(x: parentSize.width - width - indent, y: parentSize.height - height - indent, width: width, height: height) } } 

在此处输入图像描述

样本3

 func sample3(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFill imageView.drawOnCurrentImage(view: label, mode: .addSubview) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 16) viewToAdd.textColor = .yellow viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20) } } 

在此处输入图像描述

样本4

 func sample4(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFill imageView.drawOnCurrentImage(view: label, mode: .addCopiedSubview) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 16) viewToAdd.textColor = .yellow viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20) } } 

在此处输入图像描述

完整样本

不要忘记在此处添加解决方案代码

 import UIKit class ViewController: UIViewController { let imageView = UIImageView(frame: CGRect(x: 50, y: 50, width: 300, height: 300)) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let label = UILabel(frame: CGRect(x: 20, y: 20, width: 80, height: 30)) label.text = "Blablabla" label.font = UIFont.systemFont(ofSize: 20) label.textColor = .black view.addSubview(label) sample1(label: label) //sample2(label: label) //sample3(label: label) //sample4(label: label) imageView.clipsToBounds = true view.addSubview(imageView) } func sample1(label: UILabel) { imageView.contentMode = .scaleAspectFit imageView.image = UIImage(named: "wall")?.with(view: label) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 40) viewToAdd.textColor = .yellow viewToAdd.bounds = CGRect(x: 40, y: 40, width: 200, height: 20) } } func sample2(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFit imageView.drawOnCurrentImage(view: label, mode: .changeOriginalImage) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 40) viewToAdd.textColor = .yellow viewToAdd.textAlignment = .right let width: CGFloat = 200 let height: CGFloat = 30 let indent: CGFloat = 40 viewToAdd.bounds = CGRect(x: parentSize.width - width - indent, y: parentSize.height - height - indent, width: width, height: height) } } func sample3(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFill imageView.drawOnCurrentImage(view: label, mode: .addSubview) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 16) viewToAdd.textColor = .yellow viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20) } } func sample4(label: UILabel) { imageView.image = UIImage(named: "wall") imageView.contentMode = .scaleAspectFill imageView.drawOnCurrentImage(view: label, mode: .addCopiedSubview) { (parentSize, viewToAdd) in print("parentSize: \(parentSize)") viewToAdd.font = UIFont.systemFont(ofSize: 16) viewToAdd.textColor = .yellow viewToAdd.frame = CGRect(x: 40, y: 40, width: 200, height: 20) } } } 

伟大的回答瓦西里!

但在我的情况下,我需要添加这些修复程序。

文字非常小

我遇到了一个文本非常小的情况,可能是因为UIImage的大小对于14的所选字体而言太小了,所以我通过给出一个120的巨大字体来修复它。

文字没有在GIVEN CGPOINT上显示

在大UIImage大小的相同上下文中,赋予扩展名的位置错误地放置了文本,修复:添加这些2让我们计算高度和宽度的比率,然后乘以x,y点。

 let widthRatio = size.width/UIScreen.main.bounds.width let heightRatio = size.height/UIScreen.main.bounds.height 

希望能帮助任何人!