Sagar...
Sagar...

Reputation: 1062

Taking screenshot of UIView which having subview with CATransform3DMakeRotation

I am trying to generate screenshot of UIView which having subview with CATransform3DMakeRotation. Screenshot is generated but it doesn't contain Rotation.

Is it possible to achieve this?

Actual View:

enter image description here

ScreenShot Image

enter image description here

Using following call to Flip the view horizontally...

  currentView.layer.transform = CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0f));

Code for taking screen shot

+ (UIImage *) imageWithView:(UIView *)view
{
    CGSize screenDimensions = view.bounds.size;

    // Create a graphics context with the target size
    // (last parameter takes scale into account)
    UIGraphicsBeginImageContextWithOptions(screenDimensions, NO, 0);

    // Render the view to a new context
    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];

    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();

    return img;
}

Upvotes: 1

Views: 2217

Answers (6)

itechnician
itechnician

Reputation: 1655

use this and before passing the view check its subviews :

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContext(CGSizeMake(view.frame.size.width, view.frame.size.height));
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
return viewImage
}

Upvotes: 0

MeloS
MeloS

Reputation: 7938

Try rendering view.layer.presentationLayer instead of view.layer

Upvotes: 0

Surya Subenthiran
Surya Subenthiran

Reputation: 2217

The "renderInContext" only works for Affine transform. So convert the 3D transform into affine transform like this

currentView.layer.affineTransform = CATransform3DGetAffineTransform(CATransform3DConcat(currentView.layer.transform,CATransform3DMakeRotation(M_PI, 0.0, 1.0, 0.0f)));

Upvotes: 6

Geekoder
Geekoder

Reputation: 1531

This might work, try it:

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

Upvotes: 1

D-eptdeveloper
D-eptdeveloper

Reputation: 2430

i have achieved this in one of my application by doing a little tweak like first i capture the whole screen's screen shot and then crop it with the desired frame i need here is a sample code from my app.

- (UIImage *) croppedPhoto
{
    [imgcropRectangle setHidden:TRUE];
    UIGraphicsBeginImageContext(self.view.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Create bitmap image from original image data,
    // using rectangle to specify desired crop area
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], self.imgcropRectangle.frame);
    UIImage *result = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    [imgcropRectangle setHidden:FALSE];
    return result;
}

here imgcropRectangle is the UIImageView's object that defines my desired rectangle so i use it's frame for cropping from full screen to desired output. Hope it will help you :)

Upvotes: 0

Surya Subenthiran
Surya Subenthiran

Reputation: 2217

Try this code

CGSize newSize = CGSizeMake(yourview.frame.size.width , yourview.frame.size.height);
UIGraphicsBeginImageContextWithOptions(newSize,YES,2.0f);
    CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
[yourview.layer renderInContext:context];
[yourview drawRect:yourview.frame];

UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Upvotes: 1

Related Questions