1

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 倍の縮尺) です。

ここで実行する必要がある追加の手順はありますか?

4

1 に答える 1

1

私はこの質問で解決策を見つけました。rasterizationScaleCALayerの適切なプロパティを設定する必要があります。

tile.layer.rasterizationScale = [[UIScreen mainScreen] scale];
于 2012-04-24T13:48:18.820 に答える