2012-01-02 11 views
16

mediante programación. Como puede ver en mi código, tomo una captura de pantalla y la guardo en el álbum de fotos.Tomar una captura de pantalla de área específica

//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); 

Al principio yo webview.size en lugar de self.view.bounds.size y que funcionaba bien porque la vista se encuentra en 0/0. Pero ahora centré el WebView pero las imágenes comienzan en 0/0 para el tamaño dado.

¿Cómo puedo configurar que la captura de pantalla comience en otra location (por ejemplo, 300/150) para el tamaño dado?

¿O hay otra manera de tomar una foto de UIWebView?

+0

¿Funciona esto en el escritorio OSX o simplemente en el iPhone? – Noitidart

Respuesta

2

he resuelto mi problema, pero no respondió a la pregunta: ¿

he creado una subclase de UIView y moví mi UIWebView allí, por lo que está ubicado 0/0 en relación con la subclase. Luego use el tamaño de WebView:

UIGraphicsBeginImageContext(webview.frame.size); 

y el otro código anterior.

Ahora puede mover la subclase a cada ubicación que desee.

Nota: Si tiene etiquetas como etiqueta de fecha/hora, tiene que moverlas también o no las verá en la imagen.

Por lo tanto crear una subclase de UIView y mover todos los IBOutlet que quieren ser visto en la imagen allí.

La cuestión es todavía abierto: lo tanto, es posible tomar una imagen de un área específica de la pantalla?

Saludos cordiales. $ 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); 
} 

Se podría llamar esto a su punto de vista:]

+0

Se llama al método drawRect cuando se crea la vista web, de modo que tengo una imagen gris al comienzo. La idea que obtuve de esto es arrastrar el código y soltarlo en mi clase personalizada UIView donde mi vista web se encuentra en 0/0. Eso está funcionando pero ya no vi la etiqueta porque es parte de la "vista raíz". – Sharky

23

Es necesario hacer dos cambios con el fin de tomar solamente una porción de la pantalla:

  1. Crear una imagen más pequeña - utilizar el tamaño del rect desea capturar.
  2. Mueva el origen del contexto en el que está renderizando a ser negativo x/y del rect que desea capturar.

Después de eso, simplemente renderiza la capa en el contexto como lo hacía, y debería obtener lo que está buscando. Algo así debe hacerlo:

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

Esto bloquea mi aplicación. ¿Alguna idea de por qué? Agregué el framework QuartzCore y puse este código en una función, pero todavía no. –

+0

@rebellion - He conseguido que esto funcione. Aunque no en el álbum de fotos. Ver mi adaptación a continuación como un método de categoría UIView. – idStar

+0

Gracias, esto funciona muy bien para mí. Solo un pequeño problema, el color de fondo de la imagen es blanco, quiero que sea transparente. Cómo puedo hacer eso. Por favor, ayuda – iMemon

10

que he tomado y ensayado a la respuesta de escrafford arriba, y tengo que trabajar muy bien. Lo probé en el contexto de convertirlo en un método de categoría en UIView, para que el 'grabRect' pueda ser paramaterizado.Aquí está ese código, como una categoría UIView que le devuelve un 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

Este código es, por supuesto, asumiendo ARC y es actual (una solución de trabajo) como en iOS6.1. – idStar

+1

¡gran solución! ¡Gracias! – MaKo

Cuestiones relacionadas