我做了一个简单的程序来截图
目的是为了显示一个不那么全屏的模式。截取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}