Swift: Как сохранить скриншот вида со всеми видами ниже этого вида? - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно сделать скриншот таблицы (у него четкий фон).Но под ним у меня есть один ImageView и Blur View.Мне нужно получить скриншот со всеми этими представлениями.

Я пробовал разные решения, но они не захватывали виды снизу.Есть ли способы сделать это?

Кроме того, мне не нужен полный скриншот экрана.Только границы, которые ограничены tableView.Я думаю, у меня был какой-то вариант, как сделать полный скриншот, но он не работал с представлением

Я пытался:

1:

  func snapshot(of rect: CGRect? = nil) -> UIImage? {
    // snapshot entire view

    UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0)
    drawHierarchy(in: bounds, afterScreenUpdates: true)
    let wholeImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    // if no `rect` provided, return image of whole view

    guard let image = wholeImage, let rect = rect else { return wholeImage }

    // otherwise, grab specified `rect` of image

    let scale = image.scale
    let scaledRect = CGRect(x: rect.origin.x * scale, y: rect.origin.y * scale, width: rect.size.width * scale, height: rect.size.height * scale)
    guard let cgImage = image.cgImage?.cropping(to: scaledRect) else { return nil }
    return UIImage(cgImage: cgImage, scale: scale, orientation: .up)
}

2:

             UIGraphicsBeginImageContext(tableView.frame.size)
             tableView.layer.render(in: UIGraphicsGetCurrentContext()!)
             let image1 = UIGraphicsGetImageFromCurrentImageContext()!
             UIGraphicsEndImageContext()

Моя иерархия:

  • базовый UIView

    • UIImageView с изображением

      • UIBlurEffect

        • UITableView с чистым фоном, на котором отображается диаграмма

1 Ответ

0 голосов
/ 15 мая 2018

Если я понимаю ваш вопрос, вам нужен настоящий снимок экрана, но не весь экран.Поэтому сделайте необработанный снимок экрана:

let snap = UIApplication.shared.keyWindow!.snapshotView(afterScreenUpdates: true)
snap.frame = view.bounds // or something, if necessary

Примените маску к снимку экрана с рамкой, равной границам представления таблицы:

let mask = CALayer()
mask.frame = tableView.frame.bounds
mask.backgroundColor = UIColor.white.cgColor
snap.layer.mask = mask
...