3

ユニバーサル アプリケーションを作成しようとしています。画面解像度が異なると、表示がわずかに異なるはずです。しかし、次のようにコーディングすると:

- (void)viewDidLoad {
    SCREEN_WIDTH=[[UIScreen mainScreen] applicationFrame].size.width;
    SCREEN_HEIGHT=[[UIScreen mainScreen] applicationFrame].size.height;
    NSLog(@"w:%f h:%f",SCREEN_WIDTH,SCREEN_HEIGHT);
...
}

出力が得られます:w:320.000000 h:480.000000シミュレーターが
[ハードウェア] -> [デバイス] -> [iPhone (Retina)]に設定されている場合でも
、この解像度の画像はシミュレーターでフルスクリーン画像として表示されます。
を取得する必要があることを理解していw:640.000000 h:960.000000ます。
他の誰かにとってはこのようなものですか?そして、なぜ/どのように修正するかについてのアイデアはありますか? 関連スレッドを参照してください:こちら

4

3 に答える 3

5

UIScreenは常に、Retina ディスプレイ デバイスの解像度を非 Retina ディスプレイ デバイスの解像度として報告します。これにより、古いコードをそのような画面で透過的に実行できます。ただし、画面の境界と組み合わせると、デバイスの物理的なピクセル解像度を決定するために使用できるプロパティがUIScreen公開されます。scale

CGSize PhysicalPixelSizeOfScreen(UIScreen *s) {
    CGSize result = s.bounds.size;

    if ([s respondsToSelector: @selector(scale)]) {
        CGFloat scale = s.scale;
        result = CGSizeMake(result.width * scale, result.height * scale);
    }

    return result;
}

iPhone 4 での結果の値は になります{ 640.0, 960.0 }

于 2011-01-23T09:26:36.743 に答える
3

これが私が見つけたものです。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);
}
于 2011-01-23T11:26:57.883 に答える
1

画像の名前を img.png@2x に変更しましたか? また、コードで Retina ディスプレイを有効にする必要があります。

シミュレーターを Retina ディスプレイに設定しても、コードで Retina ディスプレイが有効になっていない場合でも、表示されるグラフィックは 320x480 になります。

于 2011-01-23T09:02:14.277 に答える