Как сделать так, чтобы приложение drawHierarchy не мерцало / мигало?
Я пытаюсь преобразовать основное представление приложения в данные PDF, используя
UIGraphicsPDFRenderer
. Код выглядит примерно так:
let pdfRenderer = UIGraphicsPDFRenderer()
let pdfData = pdfRenderer.pdfData { context in
context.beginPage()
view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}
Однако, как только я на самом деле запускаю это, он заставляет определенные элементы в моем приложении каждый раз мерцать.
drawHierarchy
бежит.
я могу изменить
afterScreenUpdates
к
false
чтобы предотвратить это, но мне нужно последнее обновление представления, чтобы мой захват был точным (я скрываю вложенное представление от захвата)
Я также пробовал использовать
view.layer.render(in: context)
, но полученный снимок не точен (отсутствуют цвета фона).
Есть ли способ избежать мерцания? Я не хочу захватывать поле пароля или клавиатуру, но я определенно не хочу, чтобы они мерцали.
Вот очень простое воспроизведение мигающего режима. Если вы ввели пароль в поле и нажали «захватить», поле ввода пароля будет мигать.
1 ответ
Редактировать :
Пытался захватить его таким образом, и он даже захватывает поле пароля.
class Capture {
static func capture() {
let directory = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).first!
let filePath = directory.appendingPathComponent("Test.pdf")
print(filePath)
if let rootView = UIApplication.shared.windows.first?.rootViewController?.view {
let pdfRenderer = UIGraphicsPDFRenderer(bounds: rootView.bounds)
try! pdfRenderer.writePDF(to: filePath, withActions: { (context) in
context.beginPage(withBounds: rootView.bounds, pageInfo: [:])
rootView.layer.render(in: context.cgContext)
})
}
}
}
1-я попытка:
Он будет мерцать, потому что он скрывает пароль и ключевое слово при захвате экрана:
Используемый код:
class Capture {
static func capture() {
let directory = FileManager.default.urls(for: FileManager.SearchPathDirectory.cachesDirectory, in: FileManager.SearchPathDomainMask.userDomainMask).first!
let filePath = directory.appendingPathComponent("Test.pdf")
print(filePath)
if let rootView = UIApplication.shared.windows.first?.rootViewController?.view {
let pdfRenderer = UIGraphicsPDFRenderer(bounds: rootView.bounds)
try! pdfRenderer.writePDF(to: filePath, withActions: { (context) in
context.beginPage(withBounds: rootView.bounds, pageInfo: [:])
rootView.drawHierarchy(in: rootView.bounds, afterScreenUpdates: true)
})
}
}
}