带有颜色和居中文本的 UIImage
Posted
技术标签:
【中文标题】带有颜色和居中文本的 UIImage【英文标题】:UIImage With Color & Centered Text 【发布时间】:2019-10-07 23:11:03 【问题描述】:我正在尝试向UIImage
添加一个方便的初始化程序,这将允许我创建一个图像,其中给定的文本居中,并具有给定的背景颜色:
我有以下代码:
public convenience init?(color: UIColor, withText: String, withTextColor: UIColor, size: CGSize = CGSize(width: 1, height: 1))
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
let label = UILabel()
label.text = withText
label.textAlignment = .center
label.font = UIFont.boldSystemFont(ofSize: 40)
label.textColor = withTextColor
guard let cgImage = image?.cgImage else return nil
self.init(cgImage: cgImage)
这会创建具有正确背景颜色的图像 - 不过我不确定如何在图像中间嵌入 UILabel
。
编辑
【问题讨论】:
【参考方案1】:属性字符串知道to draw themselves,所以你不需要标签。他们还可以tell you how big they are 甚至可以换行以适应可用宽度。这是一个展示如何从任何属性字符串中获取图像的游乐场:
import UIKit
import PlaygroundSupport
extension NSAttributedString
func asImage(size: CGSize = .init(width: .max, height: .max)) -> UIImage
UIGraphicsImageRenderer(bounds: boundingRect(with: size, options: [.usesLineFragmentOrigin], context: nil)).image context in
self.draw(at: .zero)
let attributedString = NSAttributedString.init(string: "testing", attributes: [NSAttributedString.Key.foregroundColor : UIColor.white])
let image = attributedString.asImage()
let imageView = UIImageView(image: image)
PlaygroundPage.current.liveView = imageView
【讨论】:
谢谢 - 你知道我如何将它与我在问题中添加的代码结合起来,该代码还为图像设置背景颜色? 只需在字符串属性中添加背景颜色即可。NSAttributedString.Key.backgroundColor: UIColor.blue
谢谢 - 设法做到了,但在这种情况下,文本的大小(“+”)似乎不正确,而且也很模糊 - 我想要实现的基本上是一个小的 + in圆圈的中间 - 所以我希望能够分别控制文本的大小和图像的大小。我将它的外观添加为问题的编辑。
您应该使用我的代码,而不是您在问题中提供的代码。 UIGraphicsImageRenderer 会考虑当前的屏幕比例,而旧的 UIGraphicsBeginImageContextWithOptions 则不会,因此您以错误的分辨率进行渲染,从而导致图像模糊。
我正在使用你的代码 - 我复制粘贴了扩展程序并按照你的建议使用它,但我仍然得到模糊的图像【参考方案2】:
这是在红色图像中心绘制白色文本的便捷初始化程序:
convenience init?(letters: String)
let style = NSMutableParagraphStyle()
style.alignment = NSTextAlignment.center
let sizeOfImage = CGSize(width: 120, height: 120)
let font = UIFont(name: "Georgia", size: 50)!
let imageText = NSAttributedString(string: letters, attributes: [.font: font, .foregroundColor: UIColor.white, .paragraphStyle: style])
let textHight = font.lineHeight
let renderer = UIGraphicsImageRenderer(size: sizeOfImage)
let image = renderer.image context in
UIColor.red.setFill()
context.fill(CGRect(origin: .zero, size: sizeOfImage))
imageText.draw(in: CGRect(origin: CGPoint(x: 0, y: (sizeOfImage.height - textHight) / 2), size: sizeOfImage))
self.init(cgImage: image.cgImage!)
【讨论】:
以上是关于带有颜色和居中文本的 UIImage的主要内容,如果未能解决你的问题,请参考以下文章