264

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

iPhone5の大きな画面サイズにどう対処すればいいのかと思っていました。

高さのピクセルが多いため、座標を使用するGCRectMakeのようなもの(および網膜/非網膜の問題でピクセルを2倍にする)は、Retinaを入手したときに発生したように、バージョン間でシームレスに機能しません。

iPadの場合と同じように、2つのストーリーボードを設計する必要がありますか?

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

4

8 に答える 8

209

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

iOS 6以降のみをサポートする予定の場合は、必ず自動レイアウトの使用を検討してください。固定レイアウト処理をすべて削除し、代わりに制約を使用してレイアウトします。ハードコーディングされるものはなく、あなたの生活はずっとシンプルになります。

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

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

テーブルビューの場合はすぐに使用できますが、アプリでコンテンツの表示にピクセル単位の完璧なレイアウトを使用している場合は、さまざまな高さに対応できるようにコンテンツを再想像するのが最善の策です。

それが不可能な場合、残っている唯一のオプションは2つのUI(iPhone5以前とiPhone5)を持つことです。

それが醜いように聞こえる場合は、余分なポイント/ピクセルが黒く表示されるデフォルトのレターボックスモデルを使用できます。

編集

アプリをiPhone5で動作させるには、ランチャーイメージの網膜バージョンを追加する必要があります。名前を付ける必要がありますDefault-568h@2x.png。そして、それは網膜品質でなければなりません-ここには下位互換性はありません:)

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

Xcodeのスクリーンショット

于 2012-09-12T22:02:30.223 に答える
84

プロジェクトの4インチのデフォルトのスプラッシュ画像として640x1136ピクセルのPNG画像(Default-568h@2x.png)を追加する必要があります。これにより、余分なスペースが使用されます(単純なテーブルベースのアプリケーションでの作業がなければ、ゲームではさらに作業が必要になります)。

すべての画面解像度を処理するために、小さな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)行#import "UIDevice+Resolutions.h"をViewController.mに追加します

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
    }
于 2012-09-13T14:48:18.340 に答える
56

アプリのiOS6.0バージョンの更新とストアへの送信が完了しました。このバージョンはiOS5.0と下位互換性があるため、メソッドを維持し、shouldAutorotateToInterfaceOrientation:以下に示すように新しいメソッドを追加しました。

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

自動回転はiOS6で変更されています。iOS6ではshouldAutorotateToInterfaceOrientation:、UIViewControllerのメソッドは非推奨になりました。代わりに、supportedInterfaceOrientationsForWindow:andshouldAutorotateメソッドを使用する必要があります。したがって、私はこれらの新しいメソッドを追加しました(そしてiOS 5互換性のために古いものを維持しました):

- (BOOL)shouldAutorotate {
    return YES;
}

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

回転が変化したため、iOS5とiOS6で自動回転をテストすることを忘れないでください。

于 2012-09-13T00:13:03.940 に答える
26

いいえ。

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

iPhone5では間違っています

if ([[UIScreen mainScreen] bounds].size.height == 568)
于 2012-09-14T13:30:34.070 に答える
17
@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)

それがiPhoneかどうかを判断するためだけにチェックする必要があるMalcomsの回答とは対照的に、

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

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

于 2012-09-13T17:06:09.063 に答える
5

OPの質問に対する@Pascalのコメントは正しいです。画像を追加するだけで、黒い境界線が削除され、アプリは全高を使用します。

デバイスがより大きなディスプレイを使用していることを確認して、CGRectを調整する必要があります。つまり、画面の下部に何かを配置する必要がある場合。

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

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;
}
于 2012-09-14T14:27:25.287 に答える
3

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

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

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

于 2012-09-12T21:44:45.967 に答える
3

高さのピクセルが多いため、座標を使用するGCRectMakeのようなものは、Retinaを入手したときに発生したように、バージョン間でシームレスに機能しません。

そうですね、 Retinaディスプレイでも同じように機能します。つまり、CoreGraphics座標系の1単位が2つの物理ピクセルに対応するだけですが、何もする必要はありません。ロジックは同じままです。(実際に、網膜以外のアプリの1つを網膜iPhoneで実行しようとしたことがありますか?

実際の質問については、明示的なCGRectMakesなどを使用しないでください...そのため、のようなものがあり[[UIScreen mainScreen] applicationFrame]ます。

于 2012-09-12T21:45:53.470 に答える