截取整个ScrollerView视图

本文介绍了在iOS中实现ScrollerView完整截图的方法,并解决了在iOS9及更早版本上出现的崩溃问题。通过调整视图大小和位置,以及使用drawViewHierarchyInRect方法来渲染视图层级,成功获取到了完整的截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因项目的需要,需要截取整个ScrollerView视图,开始搜索找到如下的相关解决方式:
转载自:http://www.cnblogs.com/willbin/p/3745067.html

- (UIImage *)captureScrollView{  
    UIImage* image = nil;  
    UIGraphicsBeginImageContext(scrollView.contentSize);  
    {  
        CGPoint savedContentOffset = scrollView.contentOffset;  
        CGRect savedFrame = scrollView.frame;  
        scrollView.contentOffset = CGPointZero;  
        scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);  

        [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];  
        image = UIGraphicsGetImageFromCurrentImageContext();  

        scrollView.contentOffset = savedContentOffset;  
        scrollView.frame = savedFrame;  
    }  
    UIGraphicsEndImageContext();  

    if (image != nil) {  
        return image;  
    }  
    return nil;  
}  

经过测试使用,貌似解决了,但是,在iOS9之前的系统,直接崩溃了,。。。。。。。。伤,,,,
错误指向:

Assertion failed: (CGFloatIsValid(x) && CGFloatIsValid(y)),
function void CGPathMoveToPoint(CGMutablePathRef, const CGAffineTransform *, CGFloat, CGFloat),
file Paths/CGPath.cc, line 254.

错误示例代码:

UIImage* image = nil;
CGSize imageSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);
UIGraphicsBeginImageContextWithOptions(imageSize, NO , 0.0f);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- ERROR image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

解决代码:

#pragma mark - 截取屏幕的图片
- (UIImage *)captureScrollView:(UIScrollView *)scrollView{

    UIImage* image = nil;
    CGSize sizes=scrollView.contentSize;
    sizes.width=sizes.width;
    sizes.height=sizes.height-20;
    UIGraphicsBeginImageContextWithOptions(sizes, NO, 0);
    {
        CGPoint savedContentOffset = scrollView.contentOffset;
        CGRect savedFrame = scrollView.frame;
        scrollView.contentOffset = CGPointZero;
        scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
        [scrollView drawViewHierarchyInRect:scrollView.bounds afterScreenUpdates:YES];
        image = UIGraphicsGetImageFromCurrentImageContext();
        scrollView.contentOffset = savedContentOffset;
        scrollView.frame = savedFrame;
    }
    UIGraphicsEndImageContext();

    if (image != nil) {
        return image;
    }
    return nil;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值