web-dev-qa-db-ja.com

iPhone5の網膜ディスプレイの画像

新しい画面サイズと解像度のiPhone5がリリースされました。

IPhone 4(網膜)用の画像を使用した場合、画像名に「@ 2x」を追加しました。誰か教えてもらえますか?新しいiPhone画面に別の画像(背景、ボタンなど)を追加することは可能ですか?

そして2番目の質問:アプリに別々のXIBファイルを含めることはできますか:古いiPhoneの場合、新しいiPhoneの場合(iPhoneやiPadなど)?

ありがとうございました!

19
Andrey

これは、この主題に関する私のブログからの例外です:

[UIImage imageNamed:] Retinaデバイスで実行すると、@ 2xバージョンの画像が自動的に読み込まれます。残念ながら、imageNamed:は、iPhone 5で実行している場合、-568h @ 2xバージョンの画像を自動的にロードしません。

これが問題にならない場合もあります。たとえば、iPhone 4と5ではアイコンとフルスクリーン以外のグラフィックが同じである可能性があります。ただし、フルスクリーンの背景画像やツールバーの全幅/高さの背景画像などがある場合は問題があります。高さ480の画像は、おそらく引き伸ばされます(結果として恐ろしく見えるでしょう)。

画面サイズを手動で確認し、次のように適切な画像を読み込むことができます。

UIImage* myImage;
CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
if ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f) {
   myImage = [UIImage imageNamed:@"myImage-568h.png"];
} else {
   myImage = [UIImage imageNamed:@"myImage.png"];
}

UIImage imageNamedを変更して、自動的に正しい画像をロードするようにする方法があります。詳細については、以下のリンクを参照してください。

詳細: http://pervasivecode.blogspot.co.uk/2012/09/making-apps-work-on-iphone-5-screen-size.html

編集:@Sound Blaster&@ GrizzlyNetchare正しい、コードではimageNamed:@ "myImage-568h.png"]を使用する必要がありますが、実際のファイル名[email protected]である必要があります。これを行わないと、彼らが言ったように、スケールが正しくありません。

50
Ben Clayton

IPhone 5には新しいピクセル密度が導入されていないため、以前に使用したすべての網膜画像を使用できます。

IPhone 5の新しい解像度をサポートするために必要なのは、ビューがウィンドウを上に表示するようにすることだけです。テーブルビューやスクロールビューなどのほとんどのビューでは、これによって問題が発生することはありません。

また、新しい解像度のために追加のXIBファイルを追加する必要はありません。これもサポートされていません。

[email protected]をアプリバンドルに追加するだけで、iOS6でアプリがiPhone5で利用可能な余分なスペースを占有するようになります。

タブバーなどのすべてのネイティブコントロールは、期待どおりに動作します。

アプリでiOS4.3および5. *をサポートする場合は、nib設定(Interface Builderの最初のタブ)のUse Autolayoutがオフになっていることを確認してください。

次に、ビューが正しく設定されていることを確認します autoresizingMask

11
rckoenes

編集

注意、iOS8 UIScreenの時点では、向きが考慮されています(高さを確認すると、縦向きの高さのみになる前に、縦向きの高さまたは横向きの高さの2つの値を返すことができます)が、xcassetsの方が優れています。ここで確認できます: iphoneの背景を追加する方法は?

編集終了

ベンクレイトンの回答に基づいて、iPhone5の画像を管理するための便利なカテゴリを作成しました。ありがとうございます。

+ (UIImage *) imageForName:(NSString *)imageName
{
    NSString *result = imageName;

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    BOOL isIphoneFive = ([UIScreen mainScreen].scale == 2.f && screenHeight == 568.0f);

    if (isIphoneFive)
    {
        NSString *imageNameWithoutExtension = [imageName stringByDeletingPathExtension];
        NSString *extension = [imageName pathExtension];

        result = [NSString stringWithFormat:@"%@-568h.%@",imageNameWithoutExtension, extension];
    }

    return [UIImage imageNamed:result];
}
1

if([UIScreen mainScreen] .scale == 2.f && screenHeight == 568.0f)浮動小数点数の正確な比較は、メモリへの格納方法に丸め誤差があるため、どの言語でもお勧めできません。たとえば、568.0fが567.9999999または568.0000001として保存されないことを保証することはできません。範囲を使用する方がはるかに安全です。この場合、screenHeight> 567.1fで十分です。 iPhoneでさえ物理的にピクセルの一部をサポートしていないのではないかと思います。

1
user1989656

私は現在、現在のデバイスがこの方法で4インチのiPhoneであるかどうかを検出しており、うまく機能します。hth

- (BOOL)isiPhone5{
    return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height == 568.0);
}
0
link82