web-dev-qa-db-ja.com

iOS 6アプリ - iPhone 5の画面サイズにどう対処するか?

可能な重複:
iPhone 5の画面解像度用にアプリを開発または移行するにはどうすればいいですか?

私はiPhone 5の大画面サイズをどう扱うべきかと疑問に思いました。

高さのピクセルが多いので、座標を使用する(そして、網膜/網膜以外の問題でピクセルを2倍にした)GCRectMakeのようなものは、 Retina を得たときに起こったようにシームレスに動作しません。

IPadと同じように、絵コンテを2枚デザインする必要がありますか。

私は個人的には、Appleがあなたが何かを描く必要がある度にあなたがスクリーンサイズをチェックすることをあなたに要求するとは思わない、多くの答えが言うように。それはiPadでも起こりますか?

264
jturolla

今日のプレゼンテーションで私が言えることから、すべてのアプリは縦に伸びた画面で機能し続けるでしょう。それらはレターボックスに入れられるか、基本的に余分な88ポイントの高さは単に黒になります。

IOS 6以降のみをサポートする予定の場合は、間違いなく自動レイアウトの使用を検討してください。すべての固定レイアウト処理を削除し、代わりに物事をレイアウトするために制約を使用します。ハードコードされたものは何もなく、あなたの人生はずっと簡単になります。

ただし、古いiOSをサポートする必要がある場合は、実際にはアプリケーションによって異なります。標準のナビゲーションバーやタブバー、あるいはその両方を使用するアプリケーションの大多数は、その余分な点を使い果たすために中央のコンテンツを単純に拡張することができます。中央のコンテンツの自動サイズ変更マスクを両方向に拡大するように設定します。

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

テーブルビューではそのまま使用できますが、コンテンツの表示にピクセルパーフェクトレイアウトを使用している場合は、さまざまな高さに対応できるようにコンテンツを再想像することをお勧めします。

それが可能性ではない場合、残りの唯一のオプションは2つのUI(iPhone 5およびiPhone 5の前)を持つことです。

それが醜いように聞こえるならば、あなたは余分な点/ピクセルがちょうど黒く見えるデフォルトのレターボックスモデルを使うことができます。

編集

アプリをiPhone 5で動作させるには、網膜版のランチャー画像を追加する必要があります。 [email protected]という名前にします。そしてそれは網膜品質でなければなりません - ここには後方互換性はありません:)

Xcode内からこの画像を選択することもできます。ターゲットに移動し、[概要]セクションの[画像の起動]を探します。画像のサイズは640 x 1136ピクセルです。これが役に立つ場合は、これを見つける場所のスクリーンショットがあります。

Xcode screenshot

209
Anurag

あなたはあなたのプロジェクトの4インチデフォルトスプラッシュイメージとして640x1136ピクセル PNG イメージ([email protected])を追加する必要があります。単純なテーブルベースのアプリケーションへの努力なしで、ゲームはより多くの努力を必要とするでしょう)。

私はすべての画面解像度に対処するために小さなUIDeviceカテゴリを作成しました。あなたは ここでそれを入手することができます 、しかしコードは以下の通りです:

ファイルUIDevice + Resolutions.h

enum {
    UIDeviceResolution_Unknown           = 0,
    UIDeviceResolution_iPhoneStandard    = 1,    // iPhone 1,3,3GS Standard Display  (320x480px)
    UIDeviceResolution_iPhoneRetina4    = 2,    // iPhone 4,4S Retina Display 3.5"  (640x960px)
    UIDeviceResolution_iPhoneRetina5     = 3,    // iPhone 5 Retina Display 4"       (640x1136px)
    UIDeviceResolution_iPadStandard      = 4,    // iPad 1,2,mini Standard Display   (1024x768px)
    UIDeviceResolution_iPadRetina        = 5     // iPad 3 Retina Display            (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;

@interface UIDevice (Resolutions)

- (UIDeviceResolution)resolution;

NSString *NSStringFromResolution(UIDeviceResolution resolution);

@end

ファイルUIDevice + Resolutions.m

#import "UIDevice+Resolutions.h"

@implementation UIDevice (Resolutions)

- (UIDeviceResolution)resolution
{
    UIDeviceResolution resolution = UIDeviceResolution_Unknown;
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
    CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if (scale == 2.0f) {
            if (pixelHeight == 960.0f)
                resolution = UIDeviceResolution_iPhoneRetina4;
            else if (pixelHeight == 1136.0f)
                resolution = UIDeviceResolution_iPhoneRetina5;

        } else if (scale == 1.0f && pixelHeight == 480.0f)
            resolution = UIDeviceResolution_iPhoneStandard;

    } else {
        if (scale == 2.0f && pixelHeight == 2048.0f) {
            resolution = UIDeviceResolution_iPadRetina;

        } else if (scale == 1.0f && pixelHeight == 1024.0f) {
            resolution = UIDeviceResolution_iPadStandard;
        }
    }

    return resolution;
 }

 @end

これがこのコードの使い方です。

1)上記のUIDevice + Resolutions.hおよびUIDevice + Resolutions.mファイルをプロジェクトに追加します。

2)ViewController.mに#import "UIDevice + Resolutions.h"という行を追加します。

3)このコードを追加して、使用しているデバイスのバージョンを確認してください。

int valueDevice = [[UIDevice currentDevice] resolution];

    NSLog(@"valueDevice: %d ...", valueDevice);

    if (valueDevice == 0)
    {
        //unknow device - you got me!
    }
    else if (valueDevice == 1)
    {
        //standard iphone 3GS and lower
    }
    else if (valueDevice == 2)
    {
        //iphone 4 & 4S
    }
    else if (valueDevice == 3)
    {
        //iphone 5
    }
    else if (valueDevice == 4)
    {
        //ipad 2
    }
    else if (valueDevice == 5)
    {
        //ipad 3 - retina display
    }
84
danielemm

私はちょうど私のアプリの一つのiOS 6.0バージョンのストアへの更新と送信を終了しました。このバージョンはiOS 5.0との後方互換性があるので、私はshouldAutorotateToInterfaceOrientation:メソッドを維持し、下記のように新しいものを追加しました。

私は次のことをしなければなりませんでした:

IOS 6では、自動回転が変わります。iOS 6では、UIViewControllerのshouldAutorotateToInterfaceOrientation:メソッドは推奨されていません。代わりに、supportedInterfaceOrientationsForWindow:およびshouldAutorotateメソッドを使用してください。したがって、私はこれらの新しいメソッドを追加しました(そしてiOS 5との互換性のために古いメソッドを使い続けました)。

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}
  • View ControllerのviewWillLayoutSubviewsメソッドを使用し、ビューの境界矩形を使用してレイアウトを調整します。
  • モーダルView Controller:willRotateToInterfaceOrientation:duration:
    willAnimateRotationToInterfaceOrientation:duration:、そして
    didRotateFromInterfaceOrientation:メソッドは、全画面表示をオーバービューにするビューコントローラでは呼び出されなくなりました。
    自体
    - たとえばpresentViewController:animated:completion:
  • それから私はそれを必要とする見解のために自動レイアウトを修正しました。
  • スタートアップビューやiTunesストア用のビューのシミュレータからPhotoShopに画像をコピーしてpngファイルとしてエクスポートしました。
  • デフォルトの画像の名前は[email protected]で、サイズは640×1136です。それはまた同じ縦モードのために640×1096を供給することを許されています(ステータスバーは取り除かれました)。あなたのアプリがiPhone上でのみ横向きを許可している場合、同様のサイズが横向きモードでも提供されるかもしれません。
  • 私はiOS 4との後方互換性を落としました。その主な理由はarmv6コードのサポートがやめられたからです。したがって、私が今サポートできるすべてのデバイス(armv7を実行している)はiOS 5にアップグレードできます。
  • 私はまたiPhone 5をサポートするためのarmv7sコードを生成しているので、それらが更新されるまで(Admobなどのような)いかなるサードパーティのフレームワークも使用することはできません。

回転の変更のため、iOS 5とiOS 6で自動回転をテストすることを忘れないでください。

56

いいえ.

if ([[UIScreen mainScreen] bounds].size.height > 960)

iPhone 5では間違っています

if ([[UIScreen mainScreen] bounds].size.height == 568)
26
user1406691
@interface UIDevice (Screen)
typedef enum
{
    iPhone          = 1 << 1,
    iPhoneRetina    = 1 << 2,
    iPhone5         = 1 << 3,
    iPad            = 1 << 4,
    iPadRetina      = 1 << 5

} DeviceType;

+ (DeviceType)deviceType;
@end

.m

#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)

+ (DeviceType)deviceType
{
    DeviceType thisDevice = 0;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        thisDevice |= iPhone;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            thisDevice |= iPhoneRetina;
            if ([[UIScreen mainScreen] bounds].size.height == 568)
                thisDevice |= iPhone5;
        }
    }
    else
    {
        thisDevice |= iPad;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
            thisDevice |= iPadRetina;
    }
    return thisDevice;
}

@end

このように、iPhoneまたはiPadのどちらであるかを(画面サイズに関係なく)検出したい場合は、次のようにします。

if ([UIDevice deviceType] & iPhone) 

または

if ([UIDevice deviceType] & iPad)

IPhone 5だけを検出したい場合は、

if ([UIDevice deviceType] & iPhone5)

Malcomsの回答とは対照的に、iPhoneであるかどうかを確認するためだけに確認する必要があると答えた場合、

if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`

どちらの方法もお互いに大きな利点はありません、それは単なる個人的な好みです。

17
endy

OPの質問に対する@ Pascalのコメントは正しいです。単に画像を追加することによって、それは黒いボーダーを取り除きます、そして、アプリはフルハイトを使います。

あなたは、デバイスがより大きいディスプレイを使用していることを決定することによって、どんなCGRectsにも調整をする必要があるでしょう。すなわち画面の下部に合わせて何かが必要な場合。

組み込みメソッドがあると確信していますが、私は何も見たことがなく、まだNDAの下にたくさんあるので、私たちのアプリで使用するメソッドは非常に単純なグローバル関数です。以下を.pchファイルに追加してから、CGRectsなどを調整するための単純なif( is4InchRetina() ) { ... }呼び出しを追加します。

static BOOL is4InchRetina()
{
    if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
        return YES;

    return NO;
}
5
Byron Rode

私はあなたが[UIScreen mainScreen].bounds.size.heightを使用してあなたのオブジェクトのためにステップを計算することができると思います。ステップを計算するときは、2つの解像度の座標を設定できます。

あるいは、上記のような高さとif(iphone5) then... else if(iphone4) then... else if(ipad)を得ることができます。このようなもの。

ストーリーボードを使用する場合は、新しいiPhone用に新しいものを作成する必要があると思います。

3
Tomasz Szulc

それがより多くのピクセルを持っているので、座標を使うGCRectMakeのようなものは、Retinaを手に入れたときに起こったように、バージョン間でシームレスには働きません。

それは、doinaはRetinaディスプレイと同じように動作します - それはちょうどCoreGraphics座標系の1つの単位が2つの物理的なピクセルに対応するということですが、する必要はありません/しません何でも、論理は同じままです。 (網膜以外のアプリの1つを網膜のiPhoneで実際に実行しようとしたことはありますか?)。

実際の質問では:それはあなたが明示的なCGRectMakesとcoを使うべきではない理由です。それが[[UIScreen mainScreen] applicationFrame]のようなものを持っている理由です。

3
user529758