2013-04-17 224 views
-3

如果您按UIButton,如何制作屏幕部分的屏幕截图? 我已经搜索了很多,但我找不到有效的答案。 Xcode是整个时间抱怨,有人可以给我一个适用于iOS 6的代码吗?屏幕部分的屏幕截图

+1

使用标准方法拍摄全屏,然后裁剪所得图像。快速搜索这两个单独的任务将为您提供所需的一切。 – rmaddy

+0

我已经这样做了,但是它给出了整个错误的时间:接收者类型'CALayer'是一个前向声明' – user2291669

+0

你需要'#import ' – rmaddy

回答

-3

您可以使用此代码(未测试):

UIGraphicsBeginImageContext(USE UR SCREEN PART); 
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
NSData * data = UIImagePNGRepresentation(image); 
[data writeToFile:@"yourscreenshot.png" atomically:YES]; 

只是在UIGraphicsBeginImageContext括号设置你的屏幕部分的相关信息。

+0

什么你的意思是使用你的屏幕部分吗?我怎样才能选择一部分的视图? – user2291669

+0

你想要截图的部分的大小 - 像:CGSizeMake(宽度,高度) – H3rrVorr4g3nd

+0

oke但我得到这个错误[自我。 window.layer renderInContext:UIGraphicsGetCurrentContext()];它说:在'ViewController *'类型的对象上找不到属性'window'' – user2291669

-1

为了捕捉一个特定视图:

UIView *theView = self.view; 
CGSize imageSize = [theView bounds].size 
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[[theView layer] renderInContext:context]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

现在,您可以保存生成的图像或做任何你想用它。

+0

必须在.h文件中创建UIView * theView吗? – user2291669

+0

@ user2291669:...不,你为什么? – Josiah

1

我以前写过这个小类。你可以使用它。后者的功能获得了整个屏幕的截图(它是从苹果的向导中获得的,所以它绝对安全)。我添加的第一部分处理不同的尺度(视网膜或常规)。愿它有所帮助。

#import "ScreenshotTaker.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation ScreenshotTaker 


+(UIImage *) captureRectOfScreen:(CGRect) rect 
{ 
    UIImage *wholeScreen = [ScreenshotTaker screenshot]; 

    //Add status bar height 
    rect.origin.y += UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation) ? [[UIApplication sharedApplication] statusBarFrame].size.width : [[UIApplication sharedApplication] statusBarFrame].size.height; 

    //NSLog(@"%@",NSStringFromCGSize([wholeScreen size])); 

    CGFloat scale = wholeScreen.scale; 

    rect.origin.x *= scale; 
    rect.origin.y *= scale; 
    rect.size.width *= scale; 
    rect.size.height *= scale; 

    UIImage *cropped = [UIImage imageWithCGImage:CGImageCreateWithImageInRect([wholeScreen CGImage], rect) scale:wholeScreen.scale orientation:wholeScreen.imageOrientation]; 

    //NSLog(@"Whole Screen Capt :%@ Scale: %f",NSStringFromCGSize([wholeScreen size]), wholeScreen.scale); 
    //NSLog(@"Rect to Crop :%@ Cropped :%@",NSStringFromCGRect(rect), NSStringFromCGSize([cropped size])); 

    return cropped; 
} 

+(UIImage *) screenshot 
{ 
    // Create a graphics context with the target size 
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration 
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext 
    CGSize imageSize = [[UIScreen mainScreen] bounds].size; 
    if (NULL != UIGraphicsBeginImageContextWithOptions) 
     UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
    else 
     UIGraphicsBeginImageContext(imageSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Iterate over every window from back to front 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
      // -renderInContext: renders in the coordinate space of the layer, 
      // so we must first apply the layer's geometry to the graphics context 
      CGContextSaveGState(context); 
      // Center the context around the window's anchor point 
      CGContextTranslateCTM(context, [window center].x, [window center].y); 
      // Apply the window's transform about the anchor point 
      CGContextConcatCTM(context, [window transform]); 
      // Offset by the portion of the bounds left of and above the anchor point 
      CGContextTranslateCTM(context, 
            -[window bounds].size.width * [[window layer] anchorPoint].x, 
            -[window bounds].size.height * [[window layer] anchorPoint].y); 

      // Render the layer hierarchy to the current context 
      [[window layer] renderInContext:context]; 

      // Restore the context 
      CGContextRestoreGState(context); 
     } 
    } 

    // Retrieve the screenshot image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 

@end