IOS截屏,View截图的基本方法

    xiaoxiao2024-12-28  17

    转载自:http://blog.csdn.net/iunion/article/details/43954941

    IOS截屏的方法网上有很多,以下是我个人认为比较好的一个,我稍微改了一点

    来源:SDScreenshotCapture

    [objc]  view plain  copy  print ? #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)  

    [objc]  view plain  copy  print ? 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.height0);               }               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文件

    [objc]  view plain  copy  print ? #import <UIKit/UIKit.h>      @interface UIWindow (Category)      - (UIImage *)screenshot;   - (UIImage *)screenshotWithRect:(CGRect)rect;      @end   m文件

    [objc]  view plain  copy  print ? #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.xself.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.width0);               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文件

    [objc]  view plain  copy  print ? @interface UIView (Screenshot)   - (UIImage *)screenshot;   - (UIImage *)screenshotWithRect:(CGRect)rect;   @end  

    m文件

    [objc]  view plain  copy  print ? @implementation UIView (Screenshot)      - (UIImage *)screenshot   {       return [self screenshotWithRect:self.bounds];   }      - (UIImage *)screenshotWithRect:(CGRect)rect;   {       UIGraphicsBeginImageContextWithOptions(rect.sizeNO, [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;   }  
    转载请注明原文地址: https://ju.6miu.com/read-1295072.html
    最新回复(0)