iOS截图的几个场景以及解决方案

来源:互联网 发布:移动工作站推荐 知乎 编辑:程序博客网 时间:2024/06/05 11:45

这篇博客提供了不同场景截图以及图片合成的API封装:

一、截取整个屏幕或者根据 frame 截取屏幕内某个固定区域

这个适用于固定布局的视图,所截取的范围在不同的屏幕尺寸上有同样的大小。为了布局的美观,其实不太推荐这种布局方式。

+ (UIImage *)transViewToImage:(UIView *)targetView targetRect:(CGRect)targetRect{    CGRect wholeRect = targetView.frame;    UIGraphicsBeginImageContext(wholeRect.size);    CGContextRef context = UIGraphicsGetCurrentContext();    [targetView.layer renderInContext:context];    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    UIImage * targetImage = [UIImage imageWithCGImage:CGImageCreateWithImageInRect([img CGImage], targetRect)];    return targetImage;}

二、截取整个 UITableView 或者 UIScrollView 的内容(包括屏幕外的部分)

这种是比较常见的一个场景,如果内容超过屏幕,依然可以完整截取。

+ (UIImage *)snapImageWithTheWholeScrollView:(UIScrollView *)tableView{    UIImage* image = nil;    CGSize contentSize;    if(tableView.contentSize.height <= 1300){        contentSize = CGSizeMake(tableView.contentSize.width, tableView.contentSize.height+10);    }else{        contentSize = CGSizeMake(tableView.contentSize.width, 1300);    }    CGRect bounds = CGRectMake(0, 0, tableView.contentSize.width, contentSize.height);    UIGraphicsBeginImageContextWithOptions(contentSize, NO, 0.0);    {        CGPoint savedContentOffset = tableView.contentOffset;        CGRect savedFrame = tableView.frame;        tableView.contentOffset = CGPointZero;        tableView.frame = bounds;        [tableView drawViewHierarchyInRect:tableView.frame                                                    afterScreenUpdates:YES];        image = UIGraphicsGetImageFromCurrentImageContext();        tableView.contentOffset = CGPointMake(savedContentOffset.x, savedContentOffset.y);        tableView.frame = savedFrame;    }    UIGraphicsEndImageContext();    return image;}

三、截图某个 UIView 的内容

该方法能直接把一个 UIView 转化为 UIImage ,也是常见的一种场景。

+ (UIImage *)transViewToImage:(UIView *)targetView{    UIGraphicsBeginImageContextWithOptions(CGSizeMake(targetView.width, targetView.height), NO, [UIScreen mainScreen].scale);    [targetView.layer renderInContext:UIGraphicsGetCurrentContext()];    UIImage *targetImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return targetImage;}

四、多图合成一个图片

把多张图片合成一个图片,这里是从上往下排列,如果需要从左往右或者其他方式,调整 frame 的排列即可。

+ (UIImage *)synthesizeImageWithImages:(NSArray *)images{    if (images.count == 0) {        return nil;    }    CGFloat totalHeight = 0.0;    CGFloat width = 0.0;    for (UIImage *image in images) {        totalHeight+=image.size.height;        if (width == 0) {            width = image.size.width;        }    }    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width,totalHeight),NO,0.0);    CGFloat _y = 0.0;    for (int i = 0; i < images.count; i++) {        UIImage *tempImage = images[i];        [tempImage drawInRect:CGRectMake(0, _y, width, tempImage.size.height)];        _y+=tempImage.size.height;    }    UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return resultImage;}

通过上面的几个方法,差不多就能应付在开发过程中所有的截图处理了。

原创粉丝点击