По какой-то причине нет API CALayer, которое не может рисовать часть слоя (возможно, потому что прерывистое чтение из графической памяти дорого), поэтому просто растеризируем все это, затем обрезаем нужную часть и конвертируем ее в JPG. Вот пример детской площадки:
import PlaygroundSupport
let label = UILabel()
label.text = "test"
label.sizeToFit()
let layerImage = UIGraphicsImageRenderer(bounds: label.bounds).image { context in
label.layer.draw(in: context.cgContext)
}
let cropRect = label.bounds.inset(by: .init(top: 2, left: 2, bottom: 2, right: 2))
let croppedImage = UIGraphicsImageRenderer(bounds: .init(origin: .zero, size: cropRect.size)).image { context in
layerImage.draw(at: .init(x: (cropRect.size.width - layerImage.size.width) / 2, y: (cropRect.size.height - layerImage.size.height) / 2))
}
let jpg = croppedImage.jpegData(compressionQuality: 0.5)