转载自:http://blog.csdn.net/iunion/article/details/43954941
IOS截屏的方法网上有很多,以下是我个人认为比较好的一个,我稍微改了一点
- #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
- UIImage *getImageWithFullScreenshot(void)
- {
- // Source (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35
- BOOL ignoreOrientation = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0");
- UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
- CGSize imageSize = CGSizeZero;
- if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation)
- imageSize = [UIScreen mainScreen].bounds.size;
- else
- imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
- UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);
- CGContextRef context = UIGraphicsGetCurrentContext();
- for (UIWindow *window in [[UIApplication sharedApplication] windows])
- {
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, window.center.x, window.center.y);
- CGContextConcatCTM(context, window.transform);
- CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
- // Correct for the screen orientation
- if(!ignoreOrientation)
- {
- if(orientation == UIInterfaceOrientationLandscapeLeft)
- {
- CGContextRotateCTM(context, (CGFloat)M_PI_2);
- CGContextTranslateCTM(context, 0, -imageSize.width);
- }
- else if(orientation == UIInterfaceOrientationLandscapeRight)
- {
- CGContextRotateCTM(context, (CGFloat)-M_PI_2);
- CGContextTranslateCTM(context, -imageSize.height, 0);
- }
- else if(orientation == UIInterfaceOrientationPortraitUpsideDown)
- {
- CGContextRotateCTM(context, (CGFloat)M_PI);
- CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
- }
- }
- if([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
- [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:NO];
- else
- [window.layer renderInContext:UIGraphicsGetCurrentContext()];
- CGContextRestoreGState(context);
- }
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }
以上是全屏截图,下面修改部分区域截图,以下代码是UIWindow的Category
h文件
- #import <UIKit/UIKit.h>
- @interface UIWindow (Category)
- - (UIImage *)screenshot;
- - (UIImage *)screenshotWithRect:(CGRect)rect;
- @end
m文件
- #import "UIWindow+Category.h"
- @implementation UIWindow (Category)
- - (UIImage *)screenshot
- {
- return [self screenshotWithRect:self.bounds];
- }
- - (UIImage *)screenshotWithRect:(CGRect)rect
- {
- // Source (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35
- BOOL ignoreOrientation = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0");
- UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
- CGSize imageSize = CGSizeZero;
- CGFloat width = rect.size.width, height = rect.size.height;
- CGFloat x = rect.origin.x, y = rect.origin.y;
- // imageSize = CGSizeMake(width, height);
- // UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);
- if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation)
- {
- //imageSize = [UIScreen mainScreen].bounds.size;
- imageSize = CGSizeMake(width, height);
- x = rect.origin.x, y = rect.origin.y;
- }
- else
- {
- //imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
- imageSize = CGSizeMake(height, width);
- x = rect.origin.y, y = rect.origin.x;
- }
- UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);
- CGContextRef context = UIGraphicsGetCurrentContext();
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, self.center.x, self.center.y);
- CGContextConcatCTM(context, self.transform);
- CGContextTranslateCTM(context, -self.bounds.size.width * self.layer.anchorPoint.x, -self.bounds.size.height * self.layer.anchorPoint.y);
- // Correct for the screen orientation
- if(!ignoreOrientation)
- {
- if(orientation == UIInterfaceOrientationLandscapeLeft)
- {
- CGContextRotateCTM(context, (CGFloat)M_PI_2);
- CGContextTranslateCTM(context, 0, -self.bounds.size.height);
- CGContextTranslateCTM(context, -x, y);
- }
- else if(orientation == UIInterfaceOrientationLandscapeRight)
- {
- CGContextRotateCTM(context, (CGFloat)-M_PI_2);
- CGContextTranslateCTM(context, -self.bounds.size.width, 0);
- CGContextTranslateCTM(context, x, -y);
- }
- else if(orientation == UIInterfaceOrientationPortraitUpsideDown)
- {
- CGContextRotateCTM(context, (CGFloat)M_PI);
- CGContextTranslateCTM(context, -self.bounds.size.height, -self.bounds.size.width);
- CGContextTranslateCTM(context, x, y);
- }
- else
- {
- CGContextTranslateCTM(context, -x, -y);
- }
- }
- else
- {
- CGContextTranslateCTM(context, -x, -y);
- }
- //[self layoutIfNeeded];
- if([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
- [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
- else
- [self.layer renderInContext:UIGraphicsGetCurrentContext()];
- CGContextRestoreGState(context);
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- return image;
- }
- @end
此代码在旋转后,裁剪区域是相对左上角为原点旋转的,一般使用不到旋转情况
View截图
h文件
- @interface UIView (Screenshot)
- - (UIImage *)screenshot;
- - (UIImage *)screenshotWithRect:(CGRect)rect;
- @end
m文件
- @implementation UIView (Screenshot)
- - (UIImage *)screenshot
- {
- return [self screenshotWithRect:self.bounds];
- }
- - (UIImage *)screenshotWithRect:(CGRect)rect;
- {
- UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
- CGContextRef context = UIGraphicsGetCurrentContext();
- if (context == NULL)
- {
- return nil;
- }
- CGContextSaveGState(context);
- CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);
- //[self layoutIfNeeded];
- if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])
- {
- [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];
- }
- else
- {
- [self.layer renderInContext:context];
- }
- CGContextRestoreGState(context);
- UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- // NSData *imageData = UIImageJPEGRepresentation(image, 1); // convert to jpeg
- // image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale];
- return image;
- }