Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有自定义字体的iOS Today小部件因内存错误而终止 今日小部件_Ios_Ios8 Today Widget_Today Extension - Fatal编程技术网

具有自定义字体的iOS Today小部件因内存错误而终止 今日小部件

具有自定义字体的iOS Today小部件因内存错误而终止 今日小部件,ios,ios8-today-widget,today-extension,Ios,Ios8 Today Widget,Today Extension,我们有一个使用自定义字体的iOS 8+应用程序。TTF文件与应用程序捆绑在一起 我们现在正在制作一个today小部件(扩展),它需要使用相同的自定义字体才能正确显示内容 TTF文件本身为142 KB 对于我的测试数据,只有3-4个字符使用自定义字体绘制 症状 问题是使用这种字体会使小部件占用过多内存,小部件会收到一些didReceiveMemoryWarning调用,然后被终止 如果我们改用“HelveticaNeue”字体,一切都会正常运行,但问题中的字符是根据HelveticaNeue而不是

我们有一个使用自定义字体的iOS 8+应用程序。TTF文件与应用程序捆绑在一起

我们现在正在制作一个today小部件(扩展),它需要使用相同的自定义字体才能正确显示内容

TTF文件本身为142 KB

对于我的测试数据,只有3-4个字符使用自定义字体绘制

症状 问题是使用这种字体会使小部件占用过多内存,小部件会收到一些didReceiveMemoryWarning调用,然后被终止

如果我们改用“HelveticaNeue”字体,一切都会正常运行,但问题中的字符是根据HelveticaNeue而不是自定义字体显示的

在iOS模拟器中一切都运行良好,但几个Stackoverflow问题/答案让我相信这很正常,iOS内存保护机制只会在设备上起作用

在iPhone6上,这个小部件在内存使用量约为20MB时被杀死,所以我们这里不谈太多。在iPhone4S上,限制似乎更低

问题 所以问题是,是否有一个解决办法。或者自定义字体的某些属性,可以进行调整或查看

让主应用程序以某种方式将字体预渲染成磁盘上可以由小部件加载的东西(png文件?)有意义吗?你会怎么做


有什么方法或建议吗?

我们还没有找到一种方法来减少字体使用的内存

通过使用ImageMagick和perl脚本为我们正在使用的所有可能的大小和字形生成png文件,我们成功地解决了这一问题

png文件放在一个带有字体名和点大小的目录结构中。每个glyph都有自己的png名称,该名称以十六进制Unicode代码点命名

然后,所有的png文件都被放入Xcode项目中,以这种方式结束在捆绑包中

在运行时,我们不使用字体进行渲染,而是执行
[UIImage imageNamed:]
并进行渲染

该解决方案性能良好,并且在小部件中使用有限的内存

有几个缺点:

  • 小部件和主应用程序包变得臃肿:添加了1000多个png文件(磁盘上575 KB=4.7 MB)。我们还不知道这会给应用程序的发行量增加多少
  • 我们失去了原有方法的灵活性。新的设备类型或更好地支持动态类型可能会导致需要更多尺寸,然后我们需要生成更多PNG
  • 更大的错误风险
  • 生成PNG的脚本为:

    #!/usr/bin/perl
    
    use File::Path qw(make_path);
    
    $fontName = "SSSymboliconsBlock";
    @sizes = (10, 11, 13, 16, 18);
    
    foreach $size (@sizes) {
        $path = "fontCache/$fontName/$size";
        make_path($path);
        @glyphs = ("1f50d", "1f512", "1f511");
    
        foreach $glyphNo (@glyphs) {
            $glyph = chr(hex($glyphNo));
            system("convert -background none -fill black -font $fontName.ttf -pointsize $size label:\"$glyph\" $path/$glyphNo.png");
        }
    }
    
    要加载图像,如下所示:

    -(UIImage*)loadImageForGlyph:(NSString*)字形
    fontName:(NSString*)fontName
    fontSize:(CGFloat)fontSize
    {
    //NSDictionary,将字形转换为十六进制字符串
    //代码点的值。
    
    //例如glyph=@“您确定它是字体吗?您是否有任何大图像或大量约束?是的,我确定。除了将我实例化的字体更改为HelveticaNeue之外,没有其他更改,小部件运行正常。