我有一个相当复杂的工作流程,在视网膜显示屏上遇到了问题。我有一个滚动视图,最多可以包含19个子视图。这些子视图中的每个子视图都由几个不同的组件(几个UILabel,一个UIImageView和一些UIButton)组成。在任何给定时间,屏幕上都有多个滚动视图,潜在的总子视图数以百计。为了节省开销,我在内存中创建每个子视图,然后将其展平为仍在内存中的UIImage。从那里,我使用UIImage作为要显示的子视图。
作为另一个节省成本的步骤,我决定将这些UIImage组合后保存到磁盘中,将路径存储在核心数据中,然后将它们从磁盘中拉出,而不是一直重新创建它们。因此,首先我在磁盘上检查是否有该文章的图像。如果没有,我创建它,将其保存到磁盘,并在屏幕上显示。
这是我要完成此操作的步骤:
// 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
}
问题在于,在没有生成图像但从文件中提取图像的时候,UILabels中的文本在视网膜显示屏上显得非常模糊。通过在模拟器中运行并在Mac上的finder中查看它们,我可以查看磁盘上生成的图像,它们看起来清晰且大小合适(2倍刻度)。
我应该在这里采取其他步骤吗?
最佳答案
我已经在此question中找到了解决方案。您必须设置CALayer的正确rasterizationScale
属性:
tile.layer.rasterizationScale = [[UIScreen mainScreen] scale];
关于iphone - 将UIView保存到图像,存储在磁盘上,然后为Retina重新显示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5823894/