Phone 用户同时按下 Home 和锁屏键就能截屏,但在应用里总不能跳出一行字让用户自己按截屏键,支持高清分辨率:
UIView *view = [[[[[UIApplication sharedApplication] windows] objectAtIndex:1] subviews] lastObject];//获得某个window的某个subView
NSInteger index = 0;//用来给保存的png命名
for (UIView *subView in [view subviews]) {//遍历这个view的subViews
if ([subView isKindOfClass:NSClassFromString(@"UIImageView")] || [subView isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {//找到自己需要的subView
//支持retina高分的关键
if(UIGraphicsBeginImageContextWithOptions != NULL)
{
UIGraphicsBeginImageContextWithOptions(subView.frame.size, NO, 0.0);
} else {
UIGraphicsBeginImageContext(subView.frame.size);
}
//获取图像
[subView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//保存图像
NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/%d.png",index];
if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) {
index += 1;
NSLog(@"Succeeded!");
}
else {
NSLog(@"Failed!");
}
}
}
UIView *view = [[[[[UIApplication sharedApplication] windows] objectAtIndex:1] subviews] lastObject];//获得某个window的某个subView
NSInteger index = 0;//用来给保存的png命名
for (UIView *subView in [view subviews]) {//遍历这个view的subViews
if ([subView isKindOfClass:NSClassFromString(@"UIImageView")] || [subView isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {//找到自己需要的subView
//支持retina高分的关键
if(UIGraphicsBeginImageContextWithOptions != NULL)
{
UIGraphicsBeginImageContextWithOptions(subView.frame.size, NO, 0.0);
} else {
UIGraphicsBeginImageContext(subView.frame.size);
}
//获取图像
[subView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//保存图像
NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/%d.png",index];
if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) {
index += 1;
NSLog(@"Succeeded!");
}
else {
NSLog(@"Failed!");
}
}
}
第二种方式
UIImage* image = nil;
#if TARGET_IPHONE_SIMULATOR
CGSize imageSize = [view bounds].size;
if (NULL != UIGraphicsBeginImageContextWithOptions)
UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
else
UIGraphicsBeginImageContext(imageSize);
CGContextRef context = UIGraphicsGetCurrentContext();
[view.layer renderInContext:context];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
#else
CGImageRef screen = UIGetScreenImage();// by smking, 使用这种方法前,需要在.m文件开始处,加入extern "C" CGImageRef UIGetScreenImage();, 这样才能使用UIGetScreenImage();函数
// by heqin, 本人测试过,在上传代码时,如果里面使用了这个方法,则会被拒,苹果认为这是个私有方法,2013.3.9
image = [UIImage imageWithCGImage:screen];
#endif
// by heqin, 另一个问题是, 上面两种方法都无法捕捉到当前屏幕中是用OpenGL绘制的情况,所以对于OpenGL的截屏,还需要进一步研究
再补充一个保存当前view到相册的方法
#import <QuartzCore/QuartzCore.h>
UIGraphicsBeginImageContext(currentView.bounds.size); //currentView 当前的view
[currentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
[currentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);