在iOS设备上截屏时如何修复丢失的“块状”数据?

5
我有一个问题,但似乎无法解决。我试图截取UIScrollView(包括屏幕外的内容)的屏幕截图,但当视图很长时,renderInContext无法获取滚动视图的所有内容。生成的图像尺寸是正确的,但渲染的数据似乎缺少显示块,留下应该存在这些块的白色空间。缺失的块来自UIWebView中的内容,我认为它被设置为“scaleToFit”。这种情况不会一直发生,只有当UIWebView的高度相当大时才会出现。这使我想到它与UIWebView的缩放有关。
如果我调整下面的coreLayer.bounds CGRECT,则会得到不同的结果,有时缺失的块位于底部,有时位于图像中间。
我从这个问题的最佳答案开始编写代码,当我注意到截断问题时,我将其修改为以下内容:
UIGraphicsBeginImageContext(scrollView.contentSize);
{
    CGPoint savedContentOffset = scrollView.contentOffset;
    CGRect savedFrame = scrollView.frame;


    //hide the scroll bars
    [scrollView setShowsHorizontalScrollIndicator:NO];
    [scrollView setShowsVerticalScrollIndicator:NO];


    scrollView.contentOffset = CGPointZero;
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
    //adjust layer for cut-off
    CALayer *coreLayer = scrollView.layer;
    coreLayer.bounds = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
    [coreLayer renderInContext: UIGraphicsGetCurrentContext()]; 
    //[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
    image = UIGraphicsGetImageFromCurrentImageContext();

    scrollView.contentOffset = savedContentOffset;
    scrollView.frame = savedFrame;


    //reset the scroll bars to default
    [scrollView setShowsHorizontalScrollIndicator:YES];
    [scrollView setShowsVerticalScrollIndicator:YES];
}
UIGraphicsEndImageContext();

裁剪调整有所帮助(通过一些视图进行修复),但当UIScrollView非常长时,仍然会被裁剪。我已经在解决这个问题上工作了一段时间,但似乎找不到解决方法。您有任何建议吗?是否有人遇到过这个问题?

请帮忙!


只是一个想法,你是否考虑过暂时将scrollView.frame.size更改为scrollView.contentSize?这将要求表视图加载所有单元格,因为它们适合框架(表视图缓存框架外的内容,而不是屏幕外)。 - Kalle
1个回答

0

你的滚动视图是一个表格视图吗?如果是这样,由于单元格重用,几乎只有屏幕上显示的内容实际存在。即使它是一个普通的滚动视图,操作系统也可能通过不渲染滚动视图的某些屏幕外元素来进行优化。如果是这样,您可以通过以编程方式一屏幕一屏幕地滚动并将每个屏幕渲染到正确位置的上下文中来使其起作用。


是的,这正是它所做的,我必须弄清楚实际渲染了多少。我发现通常一次可以查看3个“块”。然后,当您滚动UIScrollView时,它们会根据滚动方向重新绘制内容。因此,我正在对3个面板区域进行截屏,将其滚动到下一个可见的3个面板,以此类推。 - thiesdiggity
我建议您确保您的代码没有硬编码数字3。在屏幕外绘制的行数可能是一个实现细节,可能会随着新的操作系统发布而改变,甚至在另一台设备上也可能不同,这取决于可用的RAM或GPU能力。 - Zev Eisenberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接