Вам потребуется масштабировать рамку и размер шрифта надписи перед тем, как рисовать ее в новом контексте изображения:
func labelToImage(_ label: UILabel) -> UIImage? {
let size = label.frame.size.applying(.init(scaleX: 10, y: 10))
UIGraphicsBeginImageContextWithOptions(size, false, 0)
label.frame.size = size
label.font = label.font.withSize(label.font.pointSize * 10)
defer { UIGraphicsEndImageContext() }
label.draw(.init(origin: .zero, size: size))
return UIGraphicsGetImageFromCurrentImageContext()
}
Вы также можете расширить UILabel, чтобы иметь возможность масштабировать его до определенного размера или процента:
extension UILabel {
func scaledImage(to size: CGSize) -> UIImage {
let format = UIGraphicsImageRendererFormat()
format.opaque = false
let aspectRatio = size.width/frame.size.width
frame = frame.applying(.init(scaleX: aspectRatio, y: aspectRatio))
font = font.withSize(font.pointSize * aspectRatio)
return UIGraphicsImageRenderer(size: size, format: format).image { _ in
draw(.init(origin: .zero, size: size))
}
}
func scaledImage(by percentage: CGFloat) -> UIImage {
let format = UIGraphicsImageRendererFormat()
format.opaque = false
frame = frame.applying(.init(scaleX: percentage, y: percentage))
font = font.withSize(font.pointSize * percentage)
return UIGraphicsImageRenderer(size: frame.size, format: format).image { _ in
draw(.init(origin: .zero, size: frame.size))
}
}
}
Тестирование игровой площадки:
let label = UILabel(frame: .init(origin: .zero, size: .init(width: 200, height: 30)))
label.text = "StackOverflow"
label.scaledImage(by: 10)