屏幕绘制功能

需求:点击截图按钮,截取整个ScrollView.contentSize上的内容。


点击右上角截图按钮截图


屏幕绘制功能_第1张图片
点击右上截图功能


截图效果图

可以看到,底部内容是未在屏幕上显示的,属于屏幕外内容

屏幕绘制功能_第2张图片
截图显示的是整个ScorllView上的内容


实现代码

- (void)screenshotBtnClicked:(UIButton *)sender{
    //首先保存ScollView的contentSize
    CGFloat width = bgScroll.contentSize.width;
    CGFloat height = bgScroll.contentSize.height;
    _stampImageView.alpha = 1;

    //将ScollView的高度设置为contentSize.height,即拉伸整个ScrollView,并将其赋值给一个UIImage
    bgScroll.frame = CGRectMake(0,0,bgScroll.frame.size.width,bgScroll.contentSize.height);
    UIImage *img = [UIImage imageWithView:bgScroll];

    //绘制截图,并且保存到手机相册
    _stampImageView.alpha = 0;
    UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
    
    //将之前保存的ScrollView的contentSize尺寸设置回来
    bgScroll.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT - 64);
    bgScroll.contentSize = CGSizeMake(width,height);
    
    [WQCommons showToast:@"已将卡组详情截图保存到相册中" rootView:self.view];
}


另外一种方法:拼接法

- (void)screenshotBtnClicked:(UIButton *)sender{
    
    CGFloat hight = 0.0;
    CGFloat weight = 0.0;
    
    //卡组分析
    CGFloat cardanlayHight = 0.0;
    CGFloat anaDescViewHight = 0.0;
    CGSize size;
    if (![WQCommons judgeNil: _cardGroupDic[@"desc"]]) {
        cardanlayHight = [_cardanlay getFrameHeight];
        anaDescViewHight = [_anaDescView getFrameHeight];
        size = CGSizeMake(bgScroll.contentSize.width, bgScroll.contentSize.height - cardanlayHight - anaDescViewHight - HorizontalFrom750(28));
    }else{
        size = CGSizeMake(bgScroll.contentSize.width, bgScroll.contentSize.height);
    }
    UIGraphicsBeginImageContextWithOptions(size,NO,0);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    [bgScroll.backgroundColor setFill];
    CGContextFillRect(context, CGRectMake(0, 0, size.width, size.height));
    
    //顶部的职业横幅
    _stampImageView.alpha = 1;
    [_headBg.layer renderInContext:context];
    hight = [_headBg getFrameHeight];
    CGContextTranslateCTM(context,.0,hight);
    
    //卡组统计标题
    [_cardStatisBg.layer renderInContext:context];
    hight = [_cardStatisBg getFrameHeight];
    CGContextTranslateCTM(context,.0,hight + 6);
    
    //卡组统计标题下的三个分类
    [_cardSisView.layer renderInContext:context];
    hight = [_cardSisView getFrameHeight];
    CGContextTranslateCTM(context,.0,hight + 6);
    
    //随从,法术,装备label
    [_cardSisBgView.layer renderInContext:context];
    hight = [_cardSisBgView getFrameHeight];
    weight = [_cardSisBgView getFrameWidth];
    CGContextTranslateCTM(context,.0,hight + 9);
    
    //卡组统计
    [_featureSisView.layer renderInContext:context];
    hight = [_featureSisView getFrameHeight];
    CGContextTranslateCTM(context,.0,hight);
    
    CGImageRef imageMasked = CGBitmapContextCreateImage(context);
    UIImage *fullimage = [UIImage imageWithCGImage:imageMasked];
    UIGraphicsEndImageContext();
    CGImageRelease(imageMasked);

    _stampImageView.alpha = 0;
    UIImageWriteToSavedPhotosAlbum(fullimage, nil, nil, nil);
    [WQCommons showToast:@"已将卡组详情截图保存到相册中" rootView:self.view];
}


  • 当截取的对象是TableView或者是ConllectionView的时候,因为其复用的机制,如果采用第一种方法截图,会出现屏幕外的部分显示为黑色。原因可想而知是因为底部cell未被创建导致的。

  • 如果采用第二种拼接法截图,创建每一个cell拼接是可以实现功能的。但是!如果cell中包含网络图片,可能会存在图片未被加载出来就完成截屏的可能。这是因为ScrollView在最初ViewDidLoad完成时候就开始加载图片,所以用户点击截图功能时,基本上可以保证图片已经缓存在本地了(当然也有可能图片未下载下来)。

你可能感兴趣的:(屏幕绘制功能)