Как сделать так, чтобы приложение 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)
            })
        }
    }
}
Другие вопросы по тегам