带有颜色和居中文本的 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的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 卡片列对齐和文本居中

如何将带有不均匀图标的文本居中对齐?

文本在带有输入字段的居中 div 中左对齐

html 带有居中文本的完美响应圆圈

在C# winform中怎么设置文本框中部分字体的颜色,即根据条件在编程中改变文本框中部分字体的颜色

VB。如何把 TEXT 文本框中选中的字体 变成想要的颜色