これが私が見つけたものです。iOS4以降、
[[UIScreen mainScreen] applicationFrame].size.width;
と
[[UIScreen mainScreen] applicationFrame].size.height;
「ピクセル」ではなく「ポイント」で測定値を示します。他のすべての場合、ピクセル=ポイントですが、iPhone4 の場合、各ポイントは 4 ピクセルです。通常の画像は iPhone4 でスケーリングされるため、画像の各ピクセルが点にマッピングされます。これは、iPhone4 が目立った変更なしに iPhone アプリを実行できることを意味します。
iPhone のより高い解像度を利用する「高解像度」画像を追加する「Apple」の方法は、画像ファイル名の「.png」を「@2x.png」に置き換え、ピクセル密度を 2 倍にすることです (事実上、画像の幅と高さ)。重要なのは、コード内での画像の参照方法を変更しないことです。
したがって、コードに「img.png」がある場合、iPhone4 は「img@2x.png」画像が利用可能であればロードします。
これに関する問題は、ユニバーサル アプリを開発しようとしていて、可能なすべての異なる画面解像度/ピクセル密度に個別の画像を含めると、アプリがすぐに肥大化することです。
この問題の一般的な解決策は、「ネット」の必要なすべてのイメージをプルすることです。これにより、バイナリが素晴らしく小さくなります。マイナス面としては、これはユーザーのインターネット クォータを食いつぶし、wifi を持っていないユーザーを本当に悩ませます。特に、アプリが「ネットを使用する理由が他にない場合 (そして、アプリの名前を言わない場合)アプリストアの説明に 'net が必要です)。
幸いなことに、私は別の方法を見つけました。多くの場合、画像を縮小すると、iPhone4 は縮小された画像のピクセル密度の増加を利用するのに十分賢いです。たとえば、次のような場合があります。
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
[UIImage imageNamed:@"buttonImage.png"] forState:UIControlStateNormal];
ここで、buttonImage.png が 200x100 の場合、すべてにおいて完全に適切に動作します。同様に、iPad できれいに表示される 640x960 (ピクセル) の画像から始めて、小さい画面用に 320x480 の画像に縮小すると、次のようになります。
+ (UIImage*)imageWithImage:(UIImage*)image newX:(float)newX newY:(float)newY{
CGSize newSize=CGSizeMake((CGFloat)newX, (CGFloat)newY);
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newX,newY)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
iPhone4でもきれいに表示されるはずです。秘訣は、スケーリングを倍増させないことです。たとえば、次のようなことをするとします。
UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 100.0, 50.0)];
[indicatorButton setBackgroundImage:
[Utilities imageWithImage:[UIImage imageNamed:@"buttonImage.png"] newX:100 newY:50] forState:UIControlStateNormal];
そうすると、ピクセル密度が失われ、iPhone4 では画像がすべて「ピクセル」に見えます。
最後に、自分が iPhone4 かどうかを検出したい場合 (上記の手法を使用する場合は必ずしも必要ではありません)、次のコードが役立つ場合があります。
+(bool)imAnIphone4{
return([[UIScreen mainScreen]respondsToSelector:@selector(scale)] && [UIScreen mainScreen].scale==2);
}