【问题标题】:How do you fix missing "blocks" of data when taking screenshots on an iOS device?在 iOS 设备上截屏时如何修复丢失的数据“块”?
【发布时间】:2012-04-17 06:49:40
【问题描述】:

我有一个似乎无法解决的问题。我正在尝试截取 UIScrollView 的屏幕截图(包括屏幕外内容),但是当视图很长时,renderInContext 不会获得滚动视图的所有内容。生成的图像尺寸是正确的,但渲染的数据似乎缺少显示的块,在这些块应该存在的地方留下空白。缺少的块来自 UIWebView 中的内容,我相信它设置为“scaleToFit”。它不会每次都发生,它似乎只在 UIWebView 的高度相当大时发生。这让我觉得这与 UIWebView 的缩放有关。

如果我调整下面的 coreLayer.bounds CGRECT,我会得到不同的结果,有时缺失的块在底部,有时它们在图像的中间。

我从question 接受的答案中的代码开始,当我注意到截止问题时,我将其修改为以下内容:

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?这将要求表格视图加载所有单元格,因为它们适合框架(表格视图将内容缓存在其框架之外,而不是在屏幕之外)。

标签: iphone objective-c ios uiscrollview screenshot


【解决方案1】:

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

【讨论】:

  • 是的,这正是它正在做的事情,我必须弄清楚实际渲染了多少。我发现通常一次可以查看 3 个“块”。然后,当您滚动 UIScrollView 时,那些基于滚动方向的重新绘制内容。所以我正在截取 3 个面板区域的屏幕截图,将其滚动到下一个可查看的 3 个面板,等等。
  • 我会提醒您确保您的代码没有硬编码数字 3。根据可用的 RAM 或 GPU 功能,在屏幕外绘制的行数可能是一个实现细节,可能会随着新的操作系统版本而改变,甚至在另一台设备上也会有所不同。
猜你喜欢
  • 2016-01-26
  • 1970-01-01
  • 2014-02-05
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多