2015-02-13 16 views
6

Sto cercando di caricare una vista da un pennino, configurarlo, e scattare un'istantanea di esso, senza aggiungere allo schermo:Prendere un'istantanea di vista senza aggiungerlo alla schermata

+ (void)composeFromNibWithImage:(UIImage*)catImage completion:(CompletionBlock)completion { 

    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"CatNib" owner:nil options:nil]; 
    CatView *catView = [nibContents firstObject]; 

    //here, catView is the correct size from the nib, but is blank if inspected with the debugger 

    catView.catImageView.image = catImage; 
    catView.furButton.selected = YES;  
    UIImage *composite = [UIImage snapshot:catView]; 
    completion(composite); 
} 

dove istantanea è il tipico:

+ (UIImage *)snapshot:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0); 
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

Tuttavia, sia catView e composito sono dimensionate correttamente ma vuota come io passo attraverso il codice. Come posso creare un UIImage da una vista caricata da un pennino, senza aggiungere la vista allo schermo?

risposta

1

Questo sembra un po 'hacky, ma l'ho provato e ha fatto il lavoro. Se carichi la vista dal pennino dietro la vista principale, puoi fare uno screenshot di quel livello. Fintanto che non è una visualizzazione intensiva della memoria, l'utente non saprebbe mai che la vista è stata aggiunta alla vista super.

UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height)); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[catView.layer renderInContext:context]; 
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Quindi eseguire questo codice dopo aver caricato il pennino dietro la vista principale. Una volta caricato puoi rimuoverlo con `[catView removeFromSuperiew] '

+0

ero consapevole che avrei potuto fare questo con l'aggiunta in qualche modo la fine di una parte invisibile dello schermo. In realtà sto chiamando questo codice da una sottoclasse NSObject che non ha un riferimento alla vista principale, quindi speravo che ci fosse un modo per caricare il pennino, personalizzarlo e farlo uno snapshot, ma non credo. – soleil

3

Ho avuto un problema simile qualche tempo fa, e per quanto posso dire non è possibile scattare una foto di una vista, che in realtà non è su sullo schermo. Ho creato una soluzione alternativa e ho inserito la vista interessata, che volevo fare da snapshot, al di fuori dei limiti attuali della vista ViewControllers, in modo da non vederla. In questo caso è stato possibile creare uno snapshot valido. Spero che questo aiuti :)

0
UIGraphicsBeginImageContext(view.frame.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
+0

Penso che sarebbe più utile per l'OP e altri visitatori, quando aggiungerai qualche spiegazione alla tua intenzione. – reporter