【问题标题】:Max size for a screenshot (memory buffer)屏幕截图的最大大小(内存缓冲区)
【发布时间】:2012-03-14 17:06:39
【问题描述】:

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

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 高度),该功能在哪里崩溃 - 似乎在视网膜显示器上的非常长的页面上崩溃?

【问题讨论】:

    标签: iphone crash calayer retina-display


    【解决方案1】:

    我不认为内存问题会导致您的问题。您应该使用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)

    【讨论】:

    • 我尝试了你的建议 UIGraphicsBeginImageContextWithOptions (webview.bounds.size, YES, 0.0);但仍然崩溃。 Instruments 中的内存监视器将其标记为内存错误并关闭应用程序 - 所以这绝对是内存问题。
    • @akishnani:查看我编辑的答案:这可能是一个原因吗?还可以查看链接的问答
    • 没有骰子 - 仍然崩溃,我已包含 标头和框架。
    • @akishnani: 如果你注释掉UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 它不会崩溃?我仍然几乎可以肯定这不应该是内存问题。但我现在没有想法。
    • 它在这条线上崩溃了:[webView.layer renderInContext:UIGraphicsGetCurrentContext()];自分析内存监视器以来,这是 100% 的内存问题:将其标记为内存错误
    【解决方案2】:

    嗨,akishnani,我遇到了同样的问题,在遭受并搜索了所有内容之后,我发现我正在覆盖 - (void)drawRect:(CGRect)rect 方法,它正在制造问题,如果尚未解决,它可能会解决问题。

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

    【讨论】:

      【解决方案3】:

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

      我指定了一个上限(4000 CGFloat),如果我要截屏的内容超过这个上限,我会在上限处截屏。

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

      【讨论】:

        猜你喜欢
        • 2022-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 1970-01-01
        相关资源
        最近更新 更多