截取具有CATransform3DMakeRotation子视图的UIView的屏幕截图

时间:2013-09-30 14:09:03

标签: ios objective-c cocoa-touch

我正在尝试生成具有CATransform3DMakeRotation子视图的UIView的屏幕截图。屏幕截图已生成,但不包含“旋转”。

有可能实现这个目标吗?

实际观点:

enter image description here

ScreenShot图像

enter image description here

使用以下调用水平翻转视图...

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

拍摄屏幕截图的代码

+ (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;
}

6 个答案:

答案 0 :(得分:5)

" renderInContext"仅适用于仿射变换。所以将3D变换转换为像这样的仿射变换

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

答案 1 :(得分:1)

试试此代码

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

答案 2 :(得分:0)

我在我的一个应用程序中通过做一些调整来实现这一点,例如首先捕获整个屏幕的屏幕截图,然后使用所需的帧裁剪它,我需要的是我的应用程序中的示例代码。

- (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;
}

这里imgcropRectangle是UIImageView的对象,它定义了我想要的矩形,所以我使用它的框架从全屏裁剪到所需的输出。希望它能帮助你:))

答案 3 :(得分:0)

这可能会有效,请尝试:

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

答案 4 :(得分:0)

尝试渲染view.layer.presentationLayer而不是view.layer

答案 5 :(得分:0)

使用此方法并在传递视图之前检查其子视图:

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