Ответ 1
Решил проблему, переключившись на другой UIPrintFormatter
. Переключен с UIMarkupTextPrintFormatter
на UIViewPrintFormatter
который UIViewPrintFormatter
прозрачность.
Я использую UIPrintPageRenderer
вместе с UIMarkupTextPrintFormatter
для печати html-страницы, которая отображается в UIWebView
. Я пытаюсь добиться следующего:
Я хочу отобразить содержимое html в качестве прозрачного слоя в контексте, но цвет фона содержимого html всегда является белым при визуализации с UIPrintPageRenderer
в контексте, покрывающим весь контент ниже.
Стиль html содержит следующий фрагмент кода:
body {
background-color: transparent !important;;
-webkit-print-color-adjust: exact;
}
В UIWebView
я вижу, что фон html действительно прозрачен, потому что я устанавливаю фон UIWebView
на другой цвет.
Это код, который я использую для создания данных PDF:
let printPageRenderer = UIPrintPageRenderer()
let printFormatter = UIMarkupTextPrintFormatter(markupText: htmlContent)
printPageRenderer.addPrintFormatter(printFormatter, startingAtPageAt: 0)
let data = NSMutableData()
UIGraphicsBeginPDFContextToData(data, Constants.Pdf.rect, nil)
let context = UIGraphicsGetCurrentContext()!
for i in 0..<printPageRenderer.numberOfPages {
UIGraphicsBeginPDFPage()
let backCoverView = UIView(frame: Constants.Pdf.rect)
backCoverView.backgroundColor = UIColor(patternImage: UIImage(named: "background.png")!)
backCoverView.layer.render(in: context)
context.clear(printableRect)
printPageRenderer.setValue(NSValue(cgRect: printableRect), forKey: "printableRect")
printPageRenderer.drawPage(at: i, in: UIGraphicsGetPDFContextBounds())
}
UIGraphicsEndPDFContext()
Моя проблема в том, что содержимое html, которое отображается над "background.png", не прозрачно, но имеет белый фон. Прозрачный атрибут в стиле html, по-видимому, игнорируется UIPrintPageRenderer
. Установка background-color
в стиле html, например. blue
изменяет отображаемый цвет фона html от белого до синего. Я также попытался сделать рендеринг html прозрачным, сделав контекст прозрачным с помощью context.clear(printableRect)
безрезультатно.
Как я могу сделать UIPrintPageRenderer
распечатать содержимое html с прозрачным фоном, чтобы уже сделанный фон в контексте не был покрыт белым фоном html?
Решил проблему, переключившись на другой UIPrintFormatter
. Переключен с UIMarkupTextPrintFormatter
на UIViewPrintFormatter
который UIViewPrintFormatter
прозрачность.
Это не гарантия, но, как сказал Ивонн, возможно, что ваш рендеринг PDF просто не поддерживает transparent
как значение цвета.
Попробуйте создать изображение размером 1px на 1px PNG с помощью всего лишь 100% прозрачного пикселя, а затем установите это как повторяющееся фоновое изображение на свой элемент.
Возможно, что сам HTML-элемент является белым, когда эта библиотека отображает его. Вы можете применить CSS к тегу html
так же, как и с body
.
Если я правильно понимаю ваш случай, вы пытаетесь наложить визуализированный PDF файл, который находится внутри UIWebView, поверх другого содержимого в приложении. Я не могу говорить о том, действительно ли PDF может поддерживать прозрачность. UIWebView может иметь свои собственные свойства (не говоря уже о том, что может быть просмотрщик PDF со стандартным фоном белого цвета в игре). Если у вас есть контроль над стилями UIWebView, взгляните на это: Как сделать прозрачный интерфейс UIWebView
Возможно, было бы лучше использовать Canvas (HTML или Switft) для рендеринга изображения вместо PDF. Если это работает для вашего случая использования, это может быть гораздо лучший вариант долгосрочного.
Как переключиться с UIMarkupTextPrintFormatter на UIViewPrintFormatter? У меня есть UIMarkupTextPrintFormatter(markupText: HTMLContent)
сейчас. Но UIViewPrintFormatter()
не имеет markupText в качестве параметра. И если я получу UIViewPrintFormatter из UIWebView, результат будет таким же.