2016-11-30 5 views
0

Я пытаюсь сделать снимок экрана MySecondViewController.view, пока отображается MyFirstViewController. Я не хочу, чтобы MySecondViewController появлялся на экране в любой момент. Возможно ли это?Снимок экрана с изображением без его отображения

Вот мой текущий код внутри функции MyFirstViewController:

func createPreview() { 
    let mySecondViewController = self.storyboard!.instantiateViewController(withIdentifier: "MySecondViewController") 
    self.navigationController?.pushViewController(mySecondViewController, animated: false) 
    let snapshot = mySecondViewController.view.snapshot() 
    self.navigationController?.popViewController(animated: false) 
} 

Вот расширение UIView Я использую:

func snapshot() -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale) 
    drawHierarchy(in: self.bounds, afterScreenUpdates: true) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
} 

С помощью этого кода, переменная snapshot содержит невидимое изображение с хорошие размеры. Я думаю, что он снимает скриншот после того, как представление вышло из навигационного контроллера.

Если я попытаюсь установить значение afterScreenUpdates в значение false, результат будет таким же. Затем я думаю, что он берет скриншот, прежде чем представление будет нажато в навигационном контроллере.

ответ

1

Я нашел то, что искал.

Вот новый код:

func createPreview() { 
    let mySecondViewController = self.storyboard!.instantiateViewController(withIdentifier: "MySecondViewController") 
    let snapshot = mySecondViewController.view.snapshot() 
} 

extension UIView { 
    func snapshot() -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(bounds.size, self.isOpaque, UIScreen.main.scale) 
     layer.render(in: UIGraphicsGetCurrentContext()!) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image! 
    } 
}