保存uiview为图像,存储在磁盘上,然后重新显示视网膜



我有一个相当复杂的工作流程,在视网膜显示上遇到问题。我有一个滚动视图,可以包含多达19个子视图。这些子视图中的每一个都是由几个不同的组件组成的(几个uilabel,一个UIImageView,和一些UIButtons)。在任何给定的时间,屏幕上都有多个滚动视图,总共可能有数百个子视图。为了节省开销,我在内存中创建每个子视图,然后将其扁平化为仍在内存中的UIImage。从那里我使用UIImage作为子视图来显示。

作为另一个节省成本的步骤,我决定在合成后将这些UIImages保存到磁盘上,将路径存储在核心数据中,并将它们从磁盘上拉出,而不是一直重新创建它们。因此,首先在磁盘上检查是否存在该文章的映像。如果没有,我创建它,保存到磁盘,并显示在屏幕上。

以下是我为实现这一目标所采取的步骤:

// create ViewController (cut initialization code for brevity)
TileViewController *tile = [[TileViewController alloc] init];
// Figure out if working on Retina enabled device
static CGFloat scale = -1.0;
if(scale < 0.0){
    UIScreen *screen = [UIScreen mainScreen];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
        scale = [screen scale];
    }else{
        scale = 0.0;
    }
}
if(scale>0.0){
    UIGraphicsBeginImageContextWithOptions(tile.view.bounds.size, NO, scale);
}else{
    UIGraphicsBeginImageContext(tile.view.bounds.size);
}
[tile.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();           
UIGraphicsEndImageContext();
NSData *imageData = UIImagePNGRepresentation(image);
NSString *savePath = <create save path here>;
// Snipped out the code that saves this path to the core data store =
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:savePath 
             contents:imageData 
           attributes:nil];

从这里开始,我在UIImageView中使用UIImage,它被放置在屏幕上。在第一次运行时,从内存显示时,它看起来很棒。第二次,我使用以下代码从磁盘提取相同的映像:

NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:article.tileImagePath]) {
  UIImage *image = [UIImage imageWithContentsOfFile:article.tileImagePath];
  // send image to UIImageView
}

问题是,当图像没有生成,而是从文件中提取时,uilabel中的文本在视网膜显示器上显得非常模糊。我可以通过在模拟器中运行这个程序,并在mac的查找器中查看磁盘上生成的图像,它们看起来很清晰,大小也很合适(2倍缩放)。

我还需要做什么吗?

我找到了解决这个问题的方法。你必须为你的CALayer设置合适的rasterizationScale属性:

tile.layer.rasterizationScale = [[UIScreen mainScreen] scale];

相关内容

  • 没有找到相关文章

最新更新