Retina ディスプレイで問題が発生しているかなり複雑なワークフローがあります。最大 19 のサブビューで構成できるスクロールビューがあります。これらのサブビューのそれぞれは、いくつかの異なるコンポーネント (いくつかの UILabel、UIImageView、およびいくつかの UIButton) で構成されています。画面上にはいつでも複数のスクロールビューがあり、合計で数百のサブビューになる可能性があります。オーバーヘッドを節約するために、メモリ内に各サブビューを作成してから、メモリ内にある UIImage にフラット化します。そこから、表示するサブビューとして UIImage を使用します。
コスト削減のもう 1 つのステップとして、これらの 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 を使用すると、画面に配置されます。最初の実行時に、メモリから表示すると、見栄えがよくなります。2 回目は、次のコードを使用してディスクから同じイメージをプルしています。
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:article.tileImagePath]) {
UIImage *image = [UIImage imageWithContentsOfFile:article.tileImagePath];
// send image to UIImageView
}
問題は、画像が生成されずにファイルから取得されるときに、UILabels のテキストが Retina ディスプレイで非常にぼやけて表示されることです。これをシミュレーターで実行し、Mac のファインダーで表示することで、生成された画像をディスクで見ることができます。それらは鮮明に表示され、適切なサイズ (2 倍の縮尺) です。
ここで実行する必要がある追加の手順はありますか?