2017-01-27 12 views
0

Мне нужно сделать снимок экрана, который является частью другого контроллера представления, которого нет на экране.Снимок экрана с VC, который не находится на экране

Я считаю, что мне нужно создать этот VC, заполнить его правильными данными, «отобразить», а затем снять скриншот, как я могу это сделать?

Это мой текущий код, который запуская viewDidLoad() от целевой VC, но производит пустое изображение:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewController(withIdentifier: "ShareVC") as! ShareTransactionViewController 
    vc.transaction = self.transaction 

    vc.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: false) 

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, true, 0.0) 

    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

    let imageToShare = [ image ] 

Спасибо заранее

ответ

0

После некоторой работы мне удалось найти решение, это может быть не самое лучшее, поэтому, если у кого-то есть лучший подход, я был бы признателен.

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

func share(sender:UIBarButtonItem){ 

    // Create the VC that has the view we are going to share 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let vc = storyboard.instantiateViewController(withIdentifier: "ShareVC") as! ShareTransactionViewController 
    vc.transaction = self.transaction 

    // Prepare the image context 
    UIGraphicsBeginImageContextWithOptions(self.snap.bounds.size, true, 0.0) 

    // Draw the view we want to share from the created VC into the current VC 
    vc.view.drawHierarchy(in: self.snap.bounds, afterScreenUpdates: true) 

    // Adds the view from the other vc to the snap of the current VC 
    self.snap.insertSubview(vc.view, at:0) 

    // Redraws all the views of this vc 
    self.view.drawHierarchy(in: self.view.bounds, afterScreenUpdates: true) 

    // Defining the variable for activityItems 
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
    UIGraphicsEndImageContext() 

    let imageToShare = [ image ] 
    let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) 

    // set up activity view controller 
    activityViewController.popoverPresentationController?.sourceView = self.view // so iPads won't crash 

    // Present the view controllet that shares the content 
    self.present(activityViewController, animated: true, completion: nil) 

    // Removes added subview in current VC 
    for view in self.snap.subviews { 
     view.removeFromSuperview() 
    } 

} 
+0

Запрещено захватывать вид контроллера контроллера и просто вставлять его в супервизор, не выполняя детальный просмотр контроллера «танец». – matt

+0

@matt Я не уверен, как принять ваш комментарий, вы говорите, что то, что я сделал, «правильно» или что то, что я делаю, «незаконно»? – ur3k