截图的最大尺寸(内存缓冲区)

4
整个代码块包括以下内容:
CGSize layerSize = [webview sizeThatFits:CGSizeZero];

if ([UIScreen instancesRespondToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2.0f) {
    UIGraphicsBeginImageContextWithOptions(layerSize, NO, 2.0f);
} 
else {
      UIGraphicsBeginImageContext(layerSize);
}

[webview.layer renderInContext:UIGraphicsGetCurrentContext()];

screenshot = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

经过测试,发现以下代码行导致了问题: [webview.layer renderInContext:UIGraphicsGetCurrentContext()];

看起来像是内存崩溃,这个函数是否有基于设备(iPod、iPhone、iPad)的最大尺寸(宽度x高度),在视网膜屏幕上似乎会因页面过长而崩溃?

3个回答

0

我认为内存问题不是导致你的问题的原因。你应该使用 void UIGraphicsBeginImageContextWithOptions(CGSize size,BOOL opaque,CGFloat scale); 进行截屏。将最后一个参数设置为0.0,可以解决视网膜/非视网膜的问题。

"要应用于位图的比例因子。如果指定值为0.0,则比例因子设置为设备主屏幕的比例因子。" 来自 文档

UIGraphicsBeginImageContextWithOptions(webview.bounds.size, YES, 0.0);
[webview.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

编辑:你说你的应用程序仍然崩溃。

你有可能忘记添加QuartzCore框架了。

你还需要导入QuartzCore头文件

#import <QuartzCore/QuartzCore.h>

来自技术问答 QA1703(在UIKit应用程序中进行屏幕捕捉)


我尝试了你的建议 UIGraphicsBeginImageContextWithOptions (webview.bounds.size, YES, 0.0); 但仍然崩溃。在Instruments中的Memory Monitor将其标记为内存错误并关闭应用程序 - 所以这绝对是一个内存问题。 - akishnani
@akishnani:看看我编辑过的答案,可能是那个原因吗?还要看一下链接的问答。 - Rok Jarc
不行 - 仍然崩溃,我已经包含了<QuartzCore/QuartzCore.h>头文件和框架。 - akishnani
@akishnani:如果你注释掉 UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 它就不会崩溃吗?我仍然几乎确定这不应该是内存问题。但是目前没有更多想法了。 - Rok Jarc
它在这一行崩溃了:[webView.layer renderInContext:UIGraphicsGetCurrentContext()]; 这绝对是一个内存问题,因为内存监视器将其标记为内存错误。 - akishnani

0

这是一个相当古老的线程,但发现限制截图的高度是可行的。

我指定了一个上限(4000 CGFloat),如果要截图的内容超过了这个上限,我就会将截图裁剪到上限。

这帮助我减少了内存错误的发生率。


0

你好,akishnani。我之前也遇到了同样的问题。经过煎熬和谷歌搜索,我发现原来是我覆盖了(void)drawRect:(CGRect)rect方法导致了这个问题。尝试不覆盖该方法,可能就能解决问题。

-(void)drawRect:(CGRect)rect
{    [super drawRect:rect];
}

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