2014-07-18 10 views
5

Nella mia applicazione iPAD, ho due viewcontrollers, il primo viewcontroller ha un pulsante, voglio ottenere lo snapshot del secondo viewcontroler quando clicco su quel pulsante, senza caricare il secondo viewcontroller nella schermata iPAD. Se carico viewcontroler e scatto snapshot, funziona ma il mio requisito è quello di fare lo stesso senza caricare viewcontroler sullo schermo. Si prega di dare idea o link o snippet di codice.Come scattare un'istantanea di un viewcontroller senza caricare sullo schermo in ios?

+0

Come vuoi fare uno snapshot di un VC che non è ancora caricato nello stack del controller di visualizzazione? – Neeku

+0

Cosa hai provato che non ha funzionato? Mostra il codice e spiega cosa ha fatto di sbagliato. – Wain

+1

Penso che se faccio l'istanza di VC e poi un po 'come c'è un modo per scattare un'istantanea .. –

risposta

9

provare questo: - Creare l'istanza di VC per l'acquisizione di schermate e quindi passare l'oggetto con questo metodo.

+ (UIImage *)renderImageFromView:(UIView *)view withRect:(CGRect)frame { 
// Create a new context the size of the frame 
UIGraphicsBeginImageContextWithOptions(frame.size, YES, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Render the view 
[view.layer renderInContext:context]; 
//[view drawRect:frame]; 

// Get the image from the context 
UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext(); 

// Cleanup the context you created 
UIGraphicsEndImageContext(); 

return renderedImage; 
} 
+0

Questo è bello, ma non funziona se stai usando SpriteKit nella tua vista. – endavid

0

Basta istanziare il controller secondo punto di vista, e prendere uno screenshot, come:

- (void)foo 
{ 
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"secondVC"]; 
    UIImage *screenShot = [self imageFromView:vc.view]; 
    // Do something with screenShot 
} 

- (UIImage *)imageFromView:(UIView *) view 
{ 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]); 
    } else { 
     UIGraphicsBeginImageContext(view.frame.size); 
    } 
    [view.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image; 
} 
2

Questa soluzione si basa sulla risposta Dheeraj Kumar, ma questo funzionerà se la vista contiene contenuti SpriteKit pure. Richiede iOS7, però.

Il codice Swift, per il ViewController con la vista SpriteKit,

private func takeScreenshot() -> UIImage? { 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.mainScreen().scale) 
    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true) 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image 
} 
Non

parte della domanda, ma si può quindi condividere lo screenshot molto facilmente,

if let image = screenshot as? AnyObject { 
     let activity = UIActivityViewController(activityItems: [image], applicationActivities: nil) 
     self.presentViewController(activity, animated: true, completion: nil) 
    } 
Problemi correlati