2012-11-25 59 views
3

我正在嘗試截取我的界面,並且我正在使用的代碼缺少狀態欄和UIPopoverController的兩側。我聽說可能不可能包含狀態欄(這是真的嗎?),但UIPopoverController的側面是真正關心我的。以下是截圖代碼:UIPopoverController在屏幕截圖中缺少側面圖像

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

// rotate the image 
double rotation = 0; 
// rotate image based on orientation 
switch ([UIApplication sharedApplication].statusBarOrientation) { 
    case UIInterfaceOrientationLandscapeLeft: 
     rotation = M_PI/2; 
     break; 
    case UIInterfaceOrientationLandscapeRight: 
     rotation = -M_PI/2; 
     break; 
    case UIInterfaceOrientationPortraitUpsideDown: 
     rotation = M_PI; 
     break; 
    default: 
     break; 
} 

// [[UIApplication sharedApplication] statusBarOrientation] 
// calculate the size of the rotated view's containing box for our drawing space 
UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,image.size.width, image.size.height)]; 
CGAffineTransform t = CGAffineTransformMakeRotation(rotation); 
rotatedViewBox.transform = t; 
CGSize rotatedSize = rotatedViewBox.frame.size; 

// Create the bitmap context 
UIGraphicsBeginImageContext(rotatedSize); 
CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

// Move the origin to the middle of the image so we will rotate and scale around the center. 
CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

// // Rotate the image context 
CGContextRotateCTM(bitmap, rotation); 

// Now, draw the rotated/scaled image into the context 
CGContextScaleCTM(bitmap, 1.0, -1.0); 
CGContextDrawImage(bitmap, CGRectMake(-image.size.width/2, -image.size.height/2, image.size.width, image.size.height), [image CGImage]); 

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
return newImage; 

另外我創建了一個sample project演示了這一點。 Simulator ScreenshotScreenshot Generated by Code

+0

具有相同的問題。這似乎是一個蘋果本地的錯誤。當我使用下面的代碼時,這個問題會消失:'CGImageRef screen = UIGetScreenImage(); UIImage * image = [UIImage imageWithCGImage:screen];但是UIGetScreenImage()沒有記錄......所以我不能使用它...... :(如果我們得到任何答案,這將是很好的。 – Garnik

回答

0

該問題與如何呈現UIPopoverController有關。它實際上不是一個UIViewController,而是在它自己的窗口中。您需要更新您的繪圖代碼,以更多的東西一樣:

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

我沒有測試過這一點,所以給它一個鏡頭,讓我知道如何去。 :)

+0

這就是我正在使用的代碼。 – Gujamin

+0

哦,對不起。 。我一定是在看另外一個問題,並把錯誤的代碼寫到錯誤的問題上,對不起。 – Shaps