2009-08-17 16 views
6

Sto cercando un modo per catturare uno screenshot su iPhone con la barra di stato superiore incluso, Attualmente sto usando il seguente codice:Cattura lo schermo di iPhone con barra di stato inclusa?

UIGraphicsBeginImageContext(self.view.bounds.size); //self.view.window.frame.size 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

Il codice di cui sopra prende con successo uno screenshot di iPhone UIView, ma fa non includere la barra di stato superiore (al suo posto è solo uno spazio vuoto di 20px).

risposta

3

È possibile ottenere l'intero contenuto dello schermo chiamando l'API privata UIGetScreenImage. Vedere il mio previous answer in un similar question per i dettagli.

+0

ho letto su questo API privato funzione prima, sono curioso di sapere se Apple accetterà l'applicazione per l'iPhone per l'utilizzo di una funzione API privata? –

+3

I sentimenti variano a seconda dell'utilizzo delle API private. Ecco la mia risposta: 1) L'uso di API private è contro le regole di Apple ed è uno dei (pazzamente pochi) ovvi modi in cui la tua app può essere rifiutata o estratta dal negozio; ma ... 2) È probabile che qualcosa di semplice come uno screenshot voli sotto il radar e non venga notato da un reviwer; e ancora ... 3) Apple potrebbe cambiare quella API in qualsiasi momento nel futuro, con qualsiasi versione, in qualsiasi modo, per qualsiasi motivo, senza alcun preavviso. Ritengo che qualsiasi utilizzo di API private stia configurando un mal di testa di supporto e creando il potenziale per un'esperienza utente negativa. –

+0

In questo caso particolare, non penso ci sia molto rischio se la funzione è in accesso dinamico e l'errore è rappresentato: l'app può semplicemente tornare a uno screenshot usando il metodo standard. La particolare implementazione della mia risposta usa il collegamento statico, e questo è un esercizio per il lettore. – rpetrich

1

A partire dall'8 ottobre 2009, l'uso di UIGetScreenImage ha respinto la mia app! :(Non consiglierei di usarlo, credo che Apple stia cercando di ripulire tutte le app e renderle conformi alle nuove 3.x OS/API. Sto cercando un'alternativa Se qualcuno ha qualche suggerimento. API?

1

Invece di utilizzare API private, perché non rendere l'intero UIWindow nel contesto dell'immagine? potrebbe essere sufficiente sostituire self.view con self.view.window nel codice.

È inoltre possibile ottenere la finestra corrente (s) come una proprietà dell'istanza [UIApplication sharedApplication].È possibile che la barra di stato si trovi su un livello finestra separato e forse dovrai rendere le finestre in ordine

Qualcosa del genere:

UIGraphicsBeginImageContext(self.view.window.frame.size); 
for (UIWindow *window in [[UIApplication sharedApplication] windows]) { 
    [window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
} 
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

In ogni caso, probabilmente non è necessario ricorrere all'API privata.

+0

Purtroppo, utilizzando la proprietà keyWindow di UIApplication si ottiene lo stesso problema: barra di stato nera. Apparentemente non esiste un modo (legale) per catturare l'intero schermo. –

+0

La barra di stato si trova in una finestra separata. È possibile eseguire il ciclo attraverso la proprietà 'windows' di UIApplication e renderle sulla stessa immagine, in ordine. – benzado

+0

Un modo per sapere qual è la barra di stato? –

11

Come di iOS 7, si può fare questo senza l'uso di API private utilizzando

UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; 

Vedere la mia risposta a questa domanda:

Moving status bar in iOS 7

Problemi correlati