屏幕截图的最大大小(内存缓冲区)

时间:2012-03-14 17:06:40

标签: iphone crash calayer retina-display

整个代码块包含以下内容:

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 :(得分:0)

我不认为内存使用会导致您的问题。您应该使用void UIGraphicsBeginImageContextWithOptions(CGSize size,BOOL opaque,CGFloat scale);截屏。最后一个参数设置为0.0将处理视网膜/非视网膜问题。

“应用于位图的比例因子。如果指定值0.0,则比例因子将设置为设备主屏幕的比例因子。”来自documentation

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

编辑:您说您的应用仍在崩溃。

您是否可能忘记添加QuartzCore framework

您还必须导入QuartzCore header

#import <QuartzCore/QuartzCore.h>

来自Technical Q&A QA1703 (Screen Capture in UIKit Applications)

答案 1 :(得分:0)

嗨akishnani我遇到了同样的问题,在遭遇并搜索了所有内容之后,我发现了我最重要的 - (void)drawRect:(CGRect)rect方法,并且它正在创建问题,它可以解决问题,如果还没有解决的话

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

答案 2 :(得分:0)

这是一个非常古老的主题,但发现的是限制屏幕截图的高度。

我指定了一个上限(4000 CGFloat),如果我必须截取的内容超过了这个,我会按照上限截取屏幕截图。

这有助于减少内存错误的再次发生。