2012-01-02 11 views
16

Come si può vedere nel mio codice, prendo uno screenshot e lo salva nell'album fotografico.Acquisire a livello di programmazione un'area specifica

//for retina displays 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 
} else { 
    UIGraphicsBeginImageContext(self.view.bounds.size); 
} 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

All'inizio ho usato webview.size invece di self.view.bounds.size e stava funzionando correttamente perché la vista è stato localizzato a 0/0. Ma ora ho centrato la WebView ma le immagini iniziano a 0/0 per le dimensioni indicate.

Come posso configurare che lo screenshot inizia in un altro location (ad esempio 300/150) per la dimensione data?

Oppure c'è un altro modo per scattare una foto di UIWebView?

+0

Funziona su OSX desktop o solo su iphone? – Noitidart

risposta

2

ho risolto il mio problema, ma non ha risposto alla domanda:

ho creato una sottoclasse di UIView e spostato il mio UIWebView in là, in modo da che si trova 0/0 rispetto alla sottoclasse. Quindi utilizzare la dimensione del WebView:

UIGraphicsBeginImageContext(webview.frame.size); 

e l'altro codice dall'alto.

Ora è possibile spostare la sottoclasse in ogni posizione desiderata.

Nota: Se si dispone di etichette come l'etichetta data/ora, è necessario spostarle o non le si vedrà nell'immagine.

Quindi creare una sottoclasse di UIView e spostare ogni IBOutlet vuoi essere vista sull'immagine in là.

La domanda è ancora aperta: Quindi è possibile scattare una foto di un'area specifica dello schermo?

Cordiali saluti. $ H @ RKY

0
- (void)drawRect:(CGRect)rect { 
    UIGraphicsBeginImageContext(self.bounds.size);  
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
} 

Si potrebbe chiamare questo per la visualizzazione:]

+0

Il metodo drawRect viene chiamato quando viene creata la vista Web, quindi ho una foto grigia all'inizio. L'idea che ho ottenuto da questo è di trascinare il codice e rilasciarlo nella mia classe UIView personalizzata dove la mia vista web si trova a 0/0. Questo funziona ma non ho più visto l'etichetta perché fa parte della "vista radice". – Sharky

23

È necessario apportare due modifiche al fine di solo afferrare una parte dello schermo:

  1. creare un'immagine più piccola - Utilizzare la dimensione del rettangolo che si desidera catturare.
  2. Sposta l'origine del contesto in cui viene eseguito il rendering per essere negativo x/y del rect che desideri acquisire.

Dopodiché, devi solo rendere il livello nel contesto come stavi facendo e dovresti ottenere ciò che stai cercando. Qualcosa del genere dovrebbe farlo:

CGRect grabRect = CGRectMake(40,40,300,200); 

//for retina displays 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    UIGraphicsBeginImageContextWithOptions(grabRect.size, NO, [UIScreen mainScreen].scale); 
} else { 
    UIGraphicsBeginImageContext(grabRect.size); 
} 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(ctx, -grabRect.origin.x, -grabRect.origin.y); 
[self.view.layer renderInContext:ctx]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
+0

Arresto anomalo della mia app. Qualche idea del perché? Ho aggiunto il framework QuartzCore e ho inserito questo codice in una funzione, ma non ho ancora funzionato. –

+0

@rebellion - Ho ottenuto questo per funzionare. Anche se non nell'album fotografico. Vedi il mio adattamento sotto come metodo di categoria UIView. – idStar

+0

Grazie, questo funziona benissimo per me. Solo un piccolo problema il colore dello sfondo dell'immagine è bianco, lo voglio trasparente. Come lo posso fare. Please help – iMemon

10

ho preso e testato @ risposta di escrafford sopra, e preso a lavorare bene. L'ho provato nel contesto di renderlo un metodo di categoria su UIView, in modo che il 'grabRect' possa essere parametrizzato.Ecco il codice, come categoria UIView che ti restituisce UIImageView:

/** 
Takes a screenshot of a UIView at a specific point and size, as denoted by 
the provided croppingRect parameter. Returns a UIImageView of this cropped 
region. 

CREDIT: This is based on @escrafford's answer at http://stackoverflow.com/a/15304222/535054 
*/ 
- (UIImageView *)rp_screenshotImageViewWithCroppingRect:(CGRect)croppingRect { 
    // For dealing with Retina displays as well as non-Retina, we need to check 
    // the scale factor, if it is available. Note that we use the size of teh cropping Rect 
    // passed in, and not the size of the view we are taking a screenshot of. 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(croppingRect.size, YES, [UIScreen mainScreen].scale); 
    } else { 
     UIGraphicsBeginImageContext(croppingRect.size); 
    } 

    // Create a graphics context and translate it the view we want to crop so 
    // that even in grabbing (0,0), that origin point now represents the actual 
    // cropping origin desired: 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(ctx, -croppingRect.origin.x, -croppingRect.origin.y); 
    [self.layer renderInContext:ctx]; 

    // Retrieve a UIImage from the current image context: 
    UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Return the image in a UIImageView: 
    return [[UIImageView alloc] initWithImage:snapshotImage]; 
} 
+0

Questo codice è ovviamente, presupponendo ARC ed è aggiornato (una soluzione funzionante) come in iOS6.1. – idStar

+1

ottima soluzione! Grazie! – MaKo