tomar puedo pantalla mac lightshot hacer como captura objective-c uiwebview screenshot area

objective-c - puedo - screenshot mac



Tomar una captura de pantalla del área específica mediante programación. (4)

Como se puede ver en mi código, tomo una captura de pantalla y la guardo en el álbum de fotos.

//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 usé webview.size lugar de self.view.bounds.size y funcionaba correctamente porque la vista estaba ubicada 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 un UIWebView ?


Debe realizar dos cambios para poder capturar solo una parte de la pantalla:

  1. Cree una imagen más pequeña: use el tamaño del rectángulo que desea capturar.
  2. Mueva el origen del contexto que está representando para que sea x / y negativo del rect que desea capturar.

Después de eso, simplemente renderiza la capa en el contexto como lo estaba haciendo, y debería obtener lo que está buscando. Algo como esto debería 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);


Resolví mi problema pero no contesté la pregunta:

UIView una subclase de UIView y moví mi UIWebView allí, de modo que se encuentra 0/0 en relación con la subclase. Luego usa el tamaño de la vista web:

UIGraphicsBeginImageContext(webview.frame.size);

y el otro código de arriba.

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

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

Así que cree una subclase de UIView y mueva todos los IBOutlet que desee que se vean en la imagen allí.

La pregunta sigue abierta: ¿es posible tomar una imagen de un área específica de la pantalla?

Saludos cordiales. $ h @ rky


Tomé y probé la respuesta de @escrafford arriba, y conseguí que funcionara bien. Lo probé en el contexto de convertirlo en un método de categoría en UIView, para que el ''grabRect'' pueda parametrizarse. Aquí está ese código, como una categoría UIView que te 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://.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]; }


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

Podrías llamar esto a tu vista:]