500

新しい iPhone 5 ディスプレイは、新しい縦横比と新しい解像度 (640 x 1136 ピクセル) を備えています。

新規のアプリケーションを開発する、または既存のアプリケーションを新しい画面サイズに移行するには何が必要ですか?

古いディスプレイと新しいワイドスクリーンのアスペクト比の両方でアプリケーションを「ユニバーサル」にするために、何を心に留めておく必要がありますか?

4

30 に答える 30

483
  1. Xcodeの最新バージョンをダウンロードしてインストールします。
  2. アプリの起動画面ファイルを設定します(ターゲット設定の[一般]タブで)。これは、iOS 9のiPad分割ビューサイズを含む、任意の画面のフルサイズを使用する方法です。
  3. 自動サイズ変更マスクを適切に設定したか、自動レイアウトを使用した場合、すべてが魔法のように機能するはずなので、アプリをテストし、うまくいけば他に何もしません。
  4. そうでない場合は、できれば自動レイアウトを使用して、ビューのレイアウトを調整します。
  5. 大画面で特にやらなければならないことがある場合は、その[[UIScreen mainScreen] bounds]ための特定のAPIがないように見えるため、高さを確認する必要があるようです。iOS 8の時点で、画面サイズを垂直方向と水平方向に通常またはコンパクトに抽象化するサイズクラスもあり、UIを適応させるための推奨される方法です。
于 2012-09-12T23:13:02.410 に答える
117

iPhone 4S 以前用に作成されたアプリがある場合、iPhone 5 ではレターボックスで実行されます。

アプリを新しい背の高い画面に適応させるには、最初に起動イメージを Default-568h@2x.png に変更します。そのサイズは 1136x640 (HxW) である必要があります。そうです、新しい画面サイズでデフォルトの画像を使用することが、アプリが新しい iPhone 5 の画面全体を使用できるようにするための鍵です

(命名規則はデフォルトの画像に対してのみ機能することに注意してください。別の画像に「Image-568h@2x.png」という名前を付けても、「Image@2x.png」の代わりに読み込まれることはありません。別の画像を読み込む必要がある場合画面サイズが異なる場合は、プログラムで行う必要があります。)

運が良ければ、それで終わりかもしれませんが、おそらく、さらにいくつかの手順を実行する必要があります。

  • Xibs/ビューが自動レイアウトを使用してサイズを変更していることを確認してください。
  • ビューのサイズを変更するには、スプリングとストラットを使用します。
  • これがアプリにとって十分でない場合は、xib/ストーリーボードを 1 つの特定の画面サイズに合わせて設計し、プログラムで別の画面サイズに再配置します。

極端な場合 (上記のいずれでも不十分な場合)、2 つの Xib を設計し、View Controller に適切なものをロードします。

画面サイズを検出するには:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}
于 2012-09-19T20:27:26.653 に答える
30

本当に必要なのは、"Default-568h@2x.png" という名前の起動イメージをアプリ リソースに追加することだけです。通常、(運が良ければ) アプリは正しく動作します。

アプリがタッチ イベントを処理しない場合は、キー ウィンドウが適切なサイズであることを確認してください。回避策は、適切なフレームを設定することです。

[window setFrame:[[UIScreen mainScreen] bounds]]

iOS 6 に移行する場合、画面サイズに関連しない問題が他にもあります。詳細については、 iOS 6.0 のリリース ノートを参照してください。

于 2012-09-16T04:12:15.987 に答える
22

場合によっては (ストーリーボード前のアプリの場合)、レイアウトが十分に異なる場合は、viewController でデバイスに応じて異なる xib を指定する価値があります (この質問を参照してください- iPhone 5 を処理するにはコードを変更する必要があります)。異なるグラフィックスが必要な場合、マスクの自動サイズ変更をいじっても機能しないためです。

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    NSString *myNibName;
    if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
    else myNibName = @"MyNib";

    if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {


...

これは、古い iOS バージョンを対象とするアプリに役立ちます。

于 2012-10-11T08:56:51.017 に答える
20

ここに素晴らしいチュートリアルがあります(MonoTouchの場合ですが、MonoTouch以外のプロジェクトの情報も使用できます): http:
//redth.info/get-your-monotouch-apps-ready-for-iphone-5 -ios-6-今日/

  1. スプラッシュ/デフォルト画面(640 x 1136ピクセル)の新しい画像を「 Default-568h@2x.png」 という名前で作成します

  2. iOSシミュレーターで、[ハードウェア]-> [デバイス]メニューに移動し、[ iPhone(Retina 4インチ) ]を選択します。

  3. 背景画像などの他の画像を作成する

  4. iPhone 5を検出して、新しい画像を読み込みます。

public static bool IsTall
{
    get {
        return UIDevice.currentDevice.userInterfaceIdiom
                    == UIUserInterfaceIdiomPhone
                && UIScreen.mainScreen.bounds.size.height
                    * UIScreen.mainScreen.scale >= 1136;
    }
}

private static string tallMagic = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
    //adopt the -568h@2x naming convention
    if(IsTall())
    {
        var imagePath = Path.GetDirectoryName(path.ToString());
        var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
        var imageExt = Path.GetExtension(path.ToString());
        imageFile = imageFile + tallMagic + imageExt;
        return UIImage.FromFile(Path.Combine(imagePath,imageFile));
    }
    else
    {
        return UIImage.FromBundle(path.ToString());
    }
}
于 2012-09-17T13:55:42.167 に答える
13

XIBを介してiPhone5とiPhone4を移行するのは簡単です........

UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
    UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];               
}    
else
{
     UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}
于 2012-12-21T07:52:29.780 に答える
12

ここでこの問題を解決します。~568h@2x サフィックスをイメージに、~568h を xib に追加するだけです。ランタイム チェックやコード変更は必要ありません。

于 2012-11-27T08:02:09.363 に答える
10

私は新しいデフォルトの起動イメージを追加し、(他のいくつかのSEの回答をチェックして...)ストーリーボードがすべて自分自身とサブビューのサイズを自動調整したが、網膜の4インチはまだレターボックスになっていることを確認しました.

次に、情報 plist に「 Launch image 」の行項目が「 Default.png 」に設定されていることに気付きました。これを削除すると、魔法のようにレターボックスが表示されなくなりました。うまくいけば、それが私が耐えたのと同じ狂気を他の誰かが救う.

于 2012-10-26T16:50:42.313 に答える
9

ファイルにconstants.h次の定義ステートメントを追加できます。

 #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
 #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) 
 #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)
于 2013-01-29T08:11:11.500 に答える
9

すべてのケースで機能するとは限りませんが、私の特定のプロジェクトでは、NIB ファイルの重複を回避できました。

どこかでcommon.h、画面の高さに基づいてこれらの定義を行うことができます:

#define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)

ベースコントローラーで:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IS_IPHONE_5) {
        CGRect r = self.view.frame;
        r.size.height = HEIGHT_IPHONE_5 - 20;
        self.view.frame = r;
    }
    // now the view is stretched properly and not pushed to the bottom
    // it is pushed to the top instead...

    // other code goes here...
}
于 2013-03-26T07:06:43.177 に答える
9

アプリが iPhone 5 Retina をサポートできるかどうかを判断するには、次を使用します: (これは、ディスプレイのタイプ、4S Retina などを返すのにより堅牢になる可能性がありますが、以下に記述されているように、iPhone が iOS5 Retina をサポートしている場合にのみ返されます。はい、もしくは、いいえ)

一般的な「.h」ファイルに次を追加します。

BOOL IS_IPHONE5_RETINA(void);

一般的な「.m」ファイルに次を追加します。

BOOL IS_IPHONE5_RETINA(void) {
    BOOL isiPhone5Retina = NO;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if ([UIScreen mainScreen].scale == 2.0f) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960){
                //NSLog(@"iPhone 4, 4s Retina Resolution");
            }
            if(result.height == 1136){
                //NSLog(@"iPhone 5 Resolution");
                isiPhone5Retina = YES;
            }
        } else {
            //NSLog(@"iPhone Standard Resolution");
        }
    }
    return isiPhone5Retina;
}
于 2012-10-28T21:55:35.153 に答える
8

まず、2 つの xib を作成し、すべてのデリゲート、メイン クラスを にアタッチします。次に、以下のこの条件をファイルに xib入れることができます。appdelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    if ([[UIScreen mainScreen] bounds].size.height == 568)
        {

        self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
        }

        else
        {
             self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];

        }

ViewControllerクラスでも、要件に応じてプログラムのどこでも使用できます。最も重要なことは、2 つのxibファイルを別々に作成したことです。iphone 4(320*480) and iphone 5(320*568)

于 2013-08-07T05:19:48.967 に答える
7

このAuto Layout機能を使用し、iPhone 5の画面解像度を使用してデザインを作成できます。これは、4インチと3.5インチの両方のデバイスで機能しますが、この場合、レイアウトマネージャーに関する十分な知識が必要です。

于 2013-02-16T09:40:34.413 に答える
7

ランドスケープ モードでのチェックboundsは失敗します。568iPhone 5 は縦向きモードでのみ起動しますが、回転をサポートしたい場合は、iPhone 5 の「チェック」でこのシナリオも処理する必要があります。

向きの状態を処理するマクロは次のとおりです。

#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))

「preferredMode」呼び出しの使用は、数時間前に読んだ別の投稿からのものであるため、このアイデアは思いつきませんでした。

于 2013-02-04T06:42:18.937 に答える
7

シングルトン クラスで以下のメソッドを試してください。

-(NSString *)typeOfDevice
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if(result.height == 480)
            {
                return @"Iphone";
            }
            if(result.height == 568)
            {
                return @"Iphone 5";
            }
        }
        else{
            return @"Ipad";;
        }


        return @"Iphone";
    }
于 2013-03-19T06:16:25.953 に答える
6

ハードコーディングされた値なしで、すべてに対して 1 つのコードベースを持っていたので、どのデバイスでもこのような問題に直面したことはありません。私がしていることは、デバイスごとに 1 つではなく、最大サイズの画像をリソースとして持つことです。たとえば、Retina ディスプレイ用に 1 つ用意し、アスペクト フィットとして表示するので、すべてのデバイスでそのまま表示されます。ボタンのフレームなどを実行時に決めていきます。このために、特許ビューの % 値を使用します。たとえば、幅を親ビューの半分にしたい場合は、親ビューの 50% を取り、高さと中央にも同じことが適用されます。

これで、xibsさえ必要ありません。

于 2012-11-27T18:26:40.447 に答える
6

まずこの画像を見せてください。その画像では、Retina 4 サポートの警告が表示されているので、この警告をクリックして追加をクリックすると、Retina 4 スプラッシュ スクリーンがプロジェクトに自動的に追加されます。

ここに画像を表示

このコードを使用した後:

if([[UIScreen mainScreen] bounds].size.height == 568)
    {
        // For iphone 5
    }
    else
    {
        // For iphone 4 or less
    }
于 2013-06-29T10:06:02.573 に答える
5

この定義を使用して、画面サイズに基づいて iPhone 5 を使用しているかどうかを計算できます。

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

次に、簡単なifステートメントを使用します。

    if (IS_IPHONE_5) {

    // What ever changes
    }
于 2013-04-29T10:04:53.273 に答える
4

ピーター、あなたは Canappi を実際に見てみる必要があります。Canappi はあなたのためにすべてを行います。あなたがしなければならないことは、次のようにレイアウトを指定することだけです。

button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }

そこから Canappi は、アプリが実行されているデバイスを検出して使用する正しい Objective-C コードを生成します。

(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5

Canappi は、テキスト形式であることを除いて、Interface Builder と Story Board を組み合わせたように機能します。既に XIB ファイルがある場合は、それらを変換できるため、UI 全体を最初から再作成する必要はありません。

于 2012-09-25T15:30:48.917 に答える
4

画面サイズを手動で確認して、使用しているデバイスを特定できます。

#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)

float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
    // 4"

} else {

    // 3"

}
于 2013-06-04T09:16:43.197 に答える
3

これは実際のユニバーサル コードです。3 つの異なるストーリー ボードを作成できます。

プロジェクトのユニバーサル モードを設定し、メイン ストーリー iPhone を iPhone5 ストーリーボードで設定し、iPad メインを iPad ターゲット ストーリーボードで設定し、iPhone の新しいストーリーボード ターゲットを追加し、iPhone 4s 以下の解像度を変更して、AppDelegate.mを実装します。

iPhone4/4s (3/3Gs と同じ) を iPhone5 用に 1 つ作成し、iPad 用の新しい Storyboard ターゲットを使用してプロジェクトをユニバーサルにし、次のコードをAppDelegate.mdidFinishLaunching追加します。

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        UIStoryboard *storyBoard;

        CGSize result = [[UIScreen mainScreen] bounds].size;
        CGFloat scale = [UIScreen mainScreen].scale;
        result = CGSizeMake(result.width *scale, result.height *scale);

//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------

        if(result.height == 960){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }

//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------

        if(result.height == 480){
            storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }

        return YES;
 }

これで、iPhone 3/3Gs/4/4s/5、iPod のすべての世代、および iPad のすべてのタイプ用のユニバーサル アプリが作成されました。

すべての IMG をmyImage.pngおよび と統合することを忘れないでくださいmyImage@2x.png

于 2013-06-29T10:55:58.153 に答える
3

次のコードを追加できます。

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960) {
                NSLog(@"iPhone 4 Resolution");
            }
            if(result.height == 1136) {
              NSLog(@"iPhone 5 Resolution");
            }
        }
        else{
            NSLog(@"Standard Resolution");
        }
    }
于 2012-09-23T13:53:30.167 に答える
1

既存のアプリをユニバーサルに変換する必要がある場合は、対応する xib ファイルを選択する必要があります->ユーティリティを表示->サイズ インスペクターを表示します。

サイズ インスペクタでは Autosizing を確認できます。このツールを使用すると、既存の iOS アプリに変換できます。

于 2014-01-26T10:23:01.700 に答える
0

注目すべき点 - 新しい Xcode では、この画像ファイル Default-568h@2x.png をアセットに追加する必要があります

于 2014-10-06T08:36:51.557 に答える
0

iOS デバイスと iOS シミュレータの両方でテストすると、わずかな問題が発生します。シミュレーター (XCode 6.0.1) は[[UIScreen mainScreen] bounds].size、デバイスの向きに応じて幅と高さの値を切り替えるようです。

そのため、これは適切な物理画面サイズを決定する際に問題になる可能性があります。このコードは、すべての 2014 を区別するのにも役立ちます。iPhone モデルの世代:

  • アイフォーン4エス
  • iPhone5(およびiPhone5s)
  • iPhone6 (およびiPhone6+)

また、iPhone6+ と iPhone6 などを区別するために簡単に変更することもできます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
    {
        if (iOSDeviceScreenSize.width > 568 || // for iOS devices
            iOSDeviceScreenSize.height > 568) // for iOS simulator
        {   // iPhone 6 and iPhone 6+

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];

            NSLog(@"loaded iPhone6 Storyboard");
        }
        else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
                 iOSDeviceScreenSize.height == 568) // for iOS simulator
        {   // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)

            // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
            storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];

            NSLog(@"loaded iPhone5 Storyboard");
        }
        else
        {   // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)

                // Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
            storyboard = [UIStoryboard story    boardWithName:@"MainStoryboard_iPhone" bundle:nil];

                NSLog(@"loaded iPhone4 Storyboard");
        }
    }
    else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    {   // The iOS device = iPad

        storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];

        NSLog(@"loaded iPad Storyboard");
    }

    // rest my code
}
于 2014-10-10T11:03:37.717 に答える
0

Auto Layoutビューの機能を使用します。すべての解像度に自動的に調整されます。

~iphone または ~ipad のいずれかのサフィックスを持つコントローラー名を持つコントローラー用に 2 つの xib を作成します。コンパイル時に、Xcode はデバイスに基づいて適切な xib を取得します。

iPhone と iPad の両方に単一の xib を作成する場合、ビューが iPhone と iPad に移植するのに十分単純な場合は、サイズ クラスを使用します。

于 2015-01-06T08:12:14.457 に答える
0

UI インターフェイスに応じて、アプリケーションで Autoresizing Mask を使用することをお勧めします。これにより、iPhone 4 と 5 の画面で異なる UI を作成するよりも多くの手間を省くことができます。

于 2014-07-08T08:52:29.960 に答える
0

xCode 5 を使用して、[Project] > [General] で [Migrate to Asset Catalog] を選択します。

次に、「Show in finder」を使用して起動画像を見つけます。640x1136 になるようにダミー編集してから、下の画像に示すようにアセット カタログにドラッグします。

iOS7 と iOS6 R4 の両方のセクションに 640x1136 の画像があることを確認してください。次回アプリを起動すると、黒いバーが消え、アプリは 4 インチの画面を使用します

ここに画像の説明を入力

于 2014-05-08T15:51:04.783 に答える