#swift #cgrect #ios-pdfkit
#swift #cgrect #ios-pdfkit
Вопрос:
Я пытаюсь создать заголовок, в котором вся верхняя часть PDF-документа заполнена цветом.
Стандартное поведение, похоже, не зависит от того, насколько большой я установил CGRect для обрезки по краям текста.
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 16),
NSAttributedString.Key.backgroundColor : UIColor.red,
NSAttributedString.Key.foregroundColor : UIColor.white
]
let text = "Hello World!"
text.draw(in: CGRect(x: 0, y: 10, width: 2000, height: 2000), withAttributes: attributes)
Смотрите прикрепленное изображение.
Я сделал хитроумное решение, но не доволен им, поскольку пользователь может копировать «пробелы», а не фактический тест. Действительно не элегантное решение:
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 16),
NSAttributedString.Key.backgroundColor : UIColor.red,
NSAttributedString.Key.foregroundColor : UIColor.white
]
let attributesBack = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 32),
NSAttributedString.Key.backgroundColor : UIColor.red,
NSAttributedString.Key.foregroundColor : UIColor.white
]
let line = " "
let text = "Hello World!"
line.draw(in: CGRect(x: 0, y: 0, width: 2000, height: 2000), withAttributes: attributesBack)
text.draw(in: CGRect(x: 0, y: 10, width: 2000, height: 2000), withAttributes: attributes)
Это способ:
a. Чтобы либо установить CGRect, текст будет растягиваться по всей странице, как Spacer()?
б. Способ нарисовать фактический прямоугольник, а затем нарисовать текст поверх него?
Ответ №1:
Найдено следующее решение. использование UIRectFill.
func drawHeader(_ drawContext: CGContext, pageRect: CGRect) {
drawContext.saveGState()
drawContext.setLineWidth(20.0)
drawContext.addRect(CGRect(x: 0, y: 0, width: pageRect.width, height: pageRect.height))
drawContext.setFillColor(red: 177.0/256.0, green: 205.0/256.0, blue: 220.0/256.0, alpha: 0.5)
UIRectFill(CGRect(x: 0, y: 0, width: pageRect.width, height: pageRect.height))
drawContext.saveGState()
drawContext.restoreGState()
}
func myPDF() -> Data {
let pdfMetaData = [
kCGPDFContextCreator: "my PDF",
kCGPDFContextAuthor: "etienne"
]
let format = UIGraphicsPDFRendererFormat()
format.documentInfo = pdfMetaData as [String: Any]
let pageWidth = 595.2 //8.5 * 72.0
let pageHeight = 841.8 //11 * 72.0
let pageRect = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight)
let renderer = UIGraphicsPDFRenderer(bounds: pageRect, format: format)
let data = renderer.pdfData { (context) in
context.beginPage()
let attributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 16),
NSAttributedString.Key.backgroundColor : UIColor.red,
NSAttributedString.Key.foregroundColor : UIColor.blue
]
let text = "Hello World!"
text.draw(in: CGRect(x: 0, y: 10, width: 2000, height: 2000), withAttributes: attributes)
let context = context.cgContext
drawHeader(context, pageRect: pageRect)
}
return data
}