@2x 画像は、imageNamed を介して読み込まれなかった場合、常に非 Retina 画像の 2 倍の大きさになります。
Retina デバイスと非 Retina デバイスで次のようなイメージを作成します。
UIImage *anImage = [UIImage imageNamed: @"anImageName"];
NSLog(@"%@: scale: %f", NSStringFromCGSize(anImage.size), anImage.scale);
Retina デバイスに印刷される CGSize オブジェクトは、非 Retina イメージと同じサイズになりますが、スケールは 2.0 に設定されます。
明示的な retina サフィックスを使用して画像を作成すると、画像が実際には 2 倍の大きさであることがわかります。そのため、imageNamed は独自の画像スケーリングを行います。
これを既に作成されたサイズの画像ビューに表示したい場合は、何もする必要はありません。直接ロードするだけで、画像ビューは画像を正しいサイズに調整します。
ただし、新しい画像ビューを作成する場合は、UIScreen の解像度に注意してフレームを作成する必要があります (残念ながら、scale プロパティを読み取り専用に設定することはできません)。
CGRect newFrame = CGRectZero;
newFrame.size.width = (anImage.size.width / [UIScreen mainScreen].scale);
newFrame.size.height = (anImage.size.height / [UIScreen mainScreen].scale);
これは、Web サービスがデバイスの画面が Retina かどうかを認識していることを前提としています。これを自動的に取得するサービスもあれば、事前に伝える必要があるサービスもあります。YMMV。