0

我做了一个简单的程序来截图

目的是为了显示一个不那么全屏的模式。截取presentingViewController 的屏幕截图,然后将其显示在背景上。

#import <QuartzCore/CALayer.h>

@implementation UIView (screenshot)
- (UIImage*) screenshot
{
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return myImage;
}

@end

很简单。

现在我做:[BGMDCachedProperties singleton].screenShotOfLastPresentingController = self.navigationController.view.screenshot;//截屏,放到变量中

然后我做 [[BGMDCachedProperties singleton].screenShotOfLastPresentingController saveScreenshot];

-(void)saveScreenshot{
    NSData * data = UIImagePNGRepresentation(self);
    NSString * documentDirectory= [BGMDApplicationsPointers applicationDocumentsDirectory];
    NSString * fileForDocumentDirectory = [documentDirectory stringByAppendingFormat:@"/%@",@"foo.png"];
    BOOL result = [data writeToFile:fileForDocumentDirectory atomically:YES];
    if (result)
    {

    }
}

这就是我得到的: 在此处输入图像描述

然后我显示一个模拟视图控制器,其目的是显示该图像。也许我只是误解了 foo.png 对吧?我将背景设置为红色,所以我们知道

这就是我得到的: 在此处输入图像描述

显然这对我的目的不起作用,因为我需要这样做:

在此处输入图像描述

最后,我设法通过去掉屏幕截图的前 20 点来修复它。

theScreenshot = theScreenshot.crop20PointsifStatusBarShowsUp;

-(UIImage*) crop20PointsifStatusBarShowsUp
{
    if ([BGMDApplicationsPointers statusBarShowUp])
    {
        CGRect newSize = CGRectMake(0, sizeOfStatusBar, self.size.width, self.size.height-sizeOfStatusBar);
        UIImage * newImage = [self cropUIImageWithCGRect:newSize];
        return newImage;
    }
    else{
        return [self copy];
    }
}

我终于成功了: 在此处输入图像描述 但是,如果用户允许个人热点,他们的状态栏将改为 40 点。

我想知道为什么透明条会出现在 navigationController.view 中,因为与所有视图一样,导航控制器只应该填充“可用”的屏幕而不是整个屏幕。

另外我怎么知道条带的大小?没有状态栏时有时为0,有时为20,有时为40。

我添加了这两个代码:

PO(NSStringFromCGRect(self.frame));
PO(NSStringFromCGSize(myImage.size));

并得到:

2012-10-12 07:57:34.627 BadgerNew[3354:907] <0x1cdc8a60 UIView+screenshot.m:(21)> NSStringFromCGRect(self.frame): {{0, 0}, {320, 431}}
2012-10-12 07:57:34.629 BadgerNew[3354:907] <0x1cdc8a60 UIView+screenshot.m:(22)> NSStringFromCGSize(myImage.size): {320, 431}
4

1 回答 1

0

我仍然不明白为什么我会得到条。似乎 navigationController.view 总是填满整个屏幕,然后有一个透明的屏幕,所以不覆盖状态栏。

例如,modalViewController 单独存在状态栏。

所以唯一好的解决方案是只计算状态栏的大小并裁剪图像。

-(UIImage*) crop20PointsifStatusBarShowsUp
{
    CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
    float sizeOfStatusBarVar= applicationFrame.origin.y;
    if ([BGMDApplicationsPointers statusBarShowUp])
    {
        CGRect newSize = CGRectMake(0, sizeOfStatusBarVar, self.size.width, self.size.height-sizeOfStatusBarVar);
        UIImage * newImage = [self cropUIImageWithCGRect:newSize];
        return newImage;
    }
    else{
        return [self copy];
    }
}

您需要以编程方式计算它,因为如果您有私人热点,状态栏的大小通常为 40。

于 2012-10-12T01:14:23.470 回答