Можете ли вы преобразовать uiview, который в данный момент не отображается, в uiimage - PullRequest
0 голосов
/ 14 февраля 2019

Я нашел множество примеров конвертации UIView в UIImage, и они отлично работают после того, как представление было выложено и т. Д. Даже в моем контроллере представления с большим количеством строк, некоторые из которых являются чистыми, но отображаются на экране, я могусделать преобразование.К сожалению, для некоторых представлений, которые находятся слишком далеко внизу таблицы (и, следовательно, еще не «прорисованы»), выполнение преобразования приводит к пустому UIImage.

Я пытался вызвать setNeedsDisplay и layoutIfNeeded, но они не работают.Я даже пытался автоматически прокручивать таблицу, но, возможно, я не делаю так (используя потоки), который гарантирует, что прокрутка произойдет в первую очередь, что позволит обновить представления до преобразования.Я подозреваю, что это не может быть сделано, потому что я нашел различные вопросы, задающие это, и ни один не нашел решение.Или же я могу просто перерисовать весь мой вид в UIImage, не требуя UIView?

С веб-сайта Пола Хадсона

Используя любой UIView, который не отображается на экране (скажем, строка вUITableview внизу экрана внизу.

let renderer = UIGraphicsImageRenderer(size: view.bounds.size)
let image = renderer.image { ctx in
    view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы также можете сделать это, используя UIGraphicsImageRenderer.

extension UIView {

    func image() -> UIImage {
        let imageRenderer = UIGraphicsImageRenderer(bounds: bounds)
        if let format = imageRenderer.format as? UIGraphicsImageRendererFormat {
            format.opaque = true
        }
        let image = imageRenderer.image { context in
            return layer.render(in: context.cgContext)
        }
        return image
    }

}
0 голосов
/ 14 февраля 2019

Вам не нужно иметь вид в окне / на экране, чтобы иметь возможность отобразить его в изображение.Я сделал именно это в PixelTest :

extension UIView {

    /// Creates an image from the view's contents, using its layer.
    ///
    /// - Returns: An image, or nil if an image couldn't be created.
    func image() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0)
        guard let context = UIGraphicsGetCurrentContext() else { return nil }
        context.saveGState()
        layer.render(in: context)
        context.restoreGState()
        guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
        UIGraphicsEndImageContext()
        return image
    }

}

. Это позволит визуализировать слой вида в изображение таким, каким он выглядит в данный момент, если он будет отображаться на экране.То есть, если представление еще не было выложено, оно не будет выглядеть так, как вы ожидаете.PixelTest делает это, предварительно разложив представление при проверке представления для тестирования снимка.

...