1

基本的に、私のコードは[UIImage imageNamed]、デフォルトでアプリバンドルから画像を取得するものを頻繁に使用しています。

メインバンドルではなく、ドキュメント(またはライブラリなど)の奥深くにあるディレクトリから画像が返されるようにします。そして、imageNamed 呼び出しのインスタンスが非常に多いため、この目的のために UIImage ImageNamed 実装を拡張 (読み取り置換) することを検討しています。

私はすでにこれを経験しましたが、何をすべきか、何が最善かを完全に理解することはできません:

  1. UIImageのカテゴリを作る
  2. UIImage のサブクラスを作成する
  3. メソッドの入れ替え

また、@2x 画像を処理する必要があるかどうかもわかりません。私の現在のバンドルにはそれらの束が含まれており、私の実装でもそれを処理する必要があると思います。しかし、方法がわからない。

4

3 に答える 3

5

最もクリーンで、最もエレガントで、長期的に維持するのが最も簡単なソリューションは、UIImage でカテゴリを使用することです。UIImage でカスタム メソッドを定義し、検索と置換を使用してすべての imageNamed 呼び出しを新しいメソッドに置き換えます。

スウィズリングは使用しないでください (奇妙で文書化されていないバグが発生します)。保守やデバッグが非常に困難です。(また、スウィズルすると、imageNamed のデフォルトの実装を使用たい場所で壊れます)。

インスタンスメソッドは必要ないので、やろうとしていることのために UIImage をサブクラス化する必要はありません。

于 2013-02-27T21:00:31.443 に答える
1

ドキュメントディレクトリから画像を取得することが唯一の問題である場合は、次を試してください。

[UIimage imageWithContentsOfFile:yourFilePath];

//これらのメソッドを使用してファイル パスを取得できます

- (NSString *) rootPath{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) lastObject];
}

- (NSString *) pathFoResourse : (NSString *) resourseName ofType: (NSString *)type{
    NSString *path = [[self rootPath] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", resourseName, type]];
    if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
        path = [[NSBundle mainBundle] pathForResource:resourseName ofType:type];
    }
    NSLog(@"**path:%@**", path);
    return path;
}
于 2013-02-28T07:32:20.517 に答える
0

最も簡単な方法は、Category を使用することです。コードが読みやすくなります。サブクラスは作業中に混乱する可能性があります この質問では、メソッドスウィズリングを使用しない理由を説明します

于 2013-02-27T21:04:49.473 に答える