42

私のアプリをiPhone5とiPhone4/4sの両方で動作させようとしています。「AutoLayout」を試しましたが、iOS 5ではサポートされていないこともわかりました。AutoLayoutは、UIScrollviewとコードでサイズ変更されたUIPickerを備えたViewControllerで特に失敗します。4インチ用と3.5インチ用の2つのストーリーボードを用意するのが良い方法のようです。

2つのストーリーボードアプローチが私にとっての解決策のようです。したがって、これには2つの質問があります。

  1. それが4/4s / 5である場合、それを検出するコードはどこに行くべきですか?私はdidFinishLaunchingWithOptionsメソッドのappDelegate.mで仮定します

  2. 「メインストーリーボード」を変更するにはどうすればよいですか?

4

5 に答える 5

60

これは素晴らしい質問です。

あなたがする必要があるのは、

  1. 現在の4/4sストーリーボードを選択し、[ファイル]に移動して複製し、iPhone5固有の名前を付けます。 ターゲットとアプリ名がチェックされていることを確認してください。

  2. 次に、ストーリーボードでシーンを選択し、属性インスペクターでサイズをRetina4フルスクリーンに変更する必要があります。これにより、このディスプレイのすべてを再配置できます。

  3. 最後に、アプリケーションdidFinishLaunchingWithOptionsで、4インチのストーリーボードに付けたストーリーボード名を使用して次のコードを貼り付けます。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    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);
    
        if(result.height == 1136){
            storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_5" bundle:nil];
            UIViewController *initViewController = [storyBoard instantiateInitialViewController];
            [self.window setRootViewController:initViewController];
        }
    }
    
    return YES;
    }
    

手順1の方法がわからない場合は、次のようにしてください。

  1. プロジェクトディレクトリに移動し、コピーして貼り付け、MainStoryboard.storyboard新しいストーリーボードの名前を「」に変更しますMainStoryboard5.storyboard

  2. この新しいストーリーボードをプロジェクト(Xcode)に追加するにMainStoryboard5.storyboardは、[プロジェクト]を右クリックして[Add Files to ....

  3. これで、xcodeに2つのストーリーボードができました。

ヒント

上記のすべてを実行した後、これを機能させるには、「製品>クリーン」を使用する必要がある場合があります。

于 2012-09-21T19:43:35.413 に答える
7

現在、iPhone5を使用しているかどうかを確認する唯一の方法はと[UIScreen mainScreen] bounds]です[[UIScreen mainScreen] scale]

BOOL isIphone5 = (([[UIDevice currentDevice] userInterfaceIdiom] 
== UIUserInterfaceIdiomPhone) && (([UIScreen mainScreen].bounds.size.height * 
[[UIScreen mainScreen] scale]) >= 1136));

Default-568h@2x.pngこれは、少なくともアプリケーションに起動イメージを追加した場合にのみ機能します。それ以外の場合、これは常にfalseを返します。(起動画像がない場合、画面はレターボックス化されるため)

ストーリーボードをiPhone5バージョンに設定するには、この質問をご覧ください。

于 2012-09-21T19:35:00.983 に答える
2

私はfields.cageの回答に着想を得て、それを自分のコードに適合させました。これは正常に機能します。ありがとう !!

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);

        if(result.height == 1136){


             self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone5" bundle:nil] autorelease];

        }
        else
        {
             self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
        }
    }
于 2012-10-10T17:23:28.170 に答える
1

私が最近行っているのは、デバイスをチェックする必要があるクラスにdefineステートメントを追加することです。これは、任意のグローバルヘッダーファイルでも実行できます。

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

ブールテストは、Detect iphone 54"画面からのものです。

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
        // Setup For iPhone 5 Screen Size
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MyiPhone5StoryboardName" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController];
}

これは、すでにストーリーボードを使用していて、プロジェクトがiPhone5デバイスで開始したデフォルトからストーリーボードを変更したい場合にのみうまく機能します。既存の非ストーリーボードプロジェクトでゼロから始める場合は、この方法で行うことができます。

#define IS_IPHONE (!IS_IPAD)
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone)

bool isiPhone5 = CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136));
if (isiPhone5) {
        // Load iPhone 5 Storyboard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

else if (IS_IPAD) {
        // Load IPAD StoryBoard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

else {
        // Load the iPhone 3.5" storyboard
    UIStoryboard *storyBoard;

    storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
    UIViewController *initViewController = [storyBoard instantiateInitialViewController];
    [self.window setRootViewController:initViewController]; 
}

プロジェクトを開始するときは、ストーリーボードでiPhone 3.5 "バージョンをデザインします(ストーリーボードを使用している場合)。そのデザインが完了したら、プロジェクトファイルに移動して、ストーリーボードファイルを見つけます。ストーリーボードファイルは単なるXMLレイアウトファイル。そのファイルを取得して、お気に入りのテキストエディタにロードし、2つのタグを変更できます。

iPhoneをiPadに変換する

  1. ファイルの先頭で targetRuntime="iOS.CocoaTouch
  2. への変更 targetRuntime="iOS.CocoaTouch.iPad"
  3. ファイルの下部にこれが表示される場合があります <simulatedScreenMetrics key="destination" type="retina4"/>
  4. これをに変更します<simulatedScreenMetrics key="destination"/>

最後の項目は、メインのストーリーボードファイルが4インチのiPhone画面用に設定されている場合にのみ表示されます。

ここで重要なのは、既存のプロジェクトにiPhone 5を追加するだけの場合、最初のチェックでデフォルトを上書きし、特別なストーリーボードファイルをロードするだけでよいということです。これにより、iPhone5のコードですべてのオブジェクトを手動でレイアウトする必要がなくなりました。

于 2012-10-24T19:04:42.450 に答える
0

最初のものは非常にうまく機能しますが、シンプルで明確ですが、乗算デバイスを統合したい場合は、ここを参照してください。

  1. iPhone5_Storyboardという名前のストーリーボードを使用してiPhone5用のプロジェクトを作成します。

  2. アプリを閉じ、フォルダー内でiPhone5_Storyboardというメインストーリーのクローンを作成し、iPhone4_Storyboardに名前を変更します。サイズを変更し、xcodeインターフェイスビルダー内のすべてのオブジェクトを並べ替えることを忘れないでください。

  3. ユニバーサルバージョンが必要な場合はオプションで、xcode内で[ファイルの追加]を使用してiPad用の新しいストーリーボードEMPTYターゲットを追加し、iphone5_storyboardを使用してCMD + Aを使用し、すべてをコピーしてiPad用の空のストーリーに貼り付けます(オブジェクトを並べ替える必要がありますが、すべてリンクされていますと作業中)。

  4. XcodeのTARGETでUniversalAppを設定し、MainStoryboardでiPhone5_Storyboardを設定し、iPadMainStoryでiPad_Storyboardを設定します。

  5. この投稿の最初の回答のおかげで、AppDelegate.m内でこのコードを使用してすべての異なるストーリーを実装する必要があります。

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

    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(AllGen)iPad1/2/3/4MiniおよびRetina用のユニバーサルアプリができました。

みんなありがとう

于 2013-03-29T16:29:15.673 に答える