2013-04-26 4 views
0

아래 코드를 사용하여 프로그래밍 방식으로 스크린 샷을 찍으면 상태 표시 줄이 있어야하는 흰색 스트립이 남습니다. 상태 표시 줄을 캡처 할 수는 없지만 흰색 빈 스트립을 잘라내는 것이 좋음을 압니다.화면 캡처에서 상태 표시 줄 제거

- (UIImage*)captureView:(UIView *)view 
{ 
CALayer *layer = [[UIApplication sharedApplication] keyWindow].layer; 
CGFloat scale = [UIScreen mainScreen].scale; 
UIGraphicsBeginImageContextWithOptions(layer.frame.size, NO, scale); 

[layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return img; 

} 

답변

2

나는이 문제를 해결해야한다, 또 다른 질문 https://stackoverflow.com/a/16067463/837244에서 내 대답을 복제 :

나는 이전에 작은 클래스 아래에이를 작성했다. 당신은 그것을 이용할 수 있습니다. 후자의 기능은 전체 화면의 스크린 샷을 얻습니다 (사과 안내서에서 가져온 것이므로 안전합니다). 그리고 내가 추가 한 첫 번째 부분은 다른 스케일 (망막 또는 일반)을 처리합니다. 도움이되기를 바랍니다.

#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 
+0

자르기 크기를 망치고, 나를 괴롭혔다. – Steve

+0

실제로 1k의 평판을 얻는 데 ** ** 감사합니다. :) – guenis

관련 문제