web-dev-qa-db-ja.com

xcode 4.5起動時にストーリーボードを選択する方法

私のアプリをiPhone 5とiPhone 4/4の両方で動作させようとしています。 「AutoLayout」を試してみましたが、iOS 5でサポートされていないことを読んで、アプリで動作しないようです。AutoLayoutは、UIScrollviewとコードでサイズ変更されたUIPickerを持つView Controllerで特に失敗します。 4インチ用と3.5インチ用の2つのストーリーボードを用意するのがよいでしょう。

2つのStoryboardのアプローチは、私にとっての解決策のようです。そのため、2つの質問が残ります。

  1. 4/4s/5の場合、どこでコードを検出する必要がありますか?私は、appDelegate.mのdidFinishLaunchingWithOptionsメソッドを想定しています。

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

42
Xaphann

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

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

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

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

  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. この新しいストーリーボードを追加MainStoryboard5.storyboardプロジェクト(Xcode)で、[プロジェクト]を右クリックして[Add Files to ....

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

ヒント

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

61
fields.cage

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

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

これは、少なくとも[email protected]起動画像をアプリケーションに追加した場合にのみ機能します。それ以外の場合、これは常にfalseを返します。 (起動画像がない場合、画面はレターボックス化されるため)

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

7
Leon Lucardie

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];
        }
    }
2
Tanos

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

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

Boolテストは iphone 5 4 "画面を検出 からです。

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];
}

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

#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を追加するだけで、デフォルトをオーバーライドして特別なストーリーボードファイルを読み込むための最初のチェックのみが必要な場合です。これにより、iPhone 5のコードですべてのオブジェクトを手動でレイアウトする必要がなくなりました。

1
Nelson Brian

最初の1つの非常に優れた作業はシンプルで明確ですが、すべての場合、乗算デバイスを統合する場合は次のようになります。

  1. IPhone5_Storyboardという名前のStoryboardを使用して、iPhone5のプロジェクトを作成します。

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

  3. ユニバーサルバージョンが必要な場合は、xcode内で[ファイルの追加]を使用し、iPad用の新しいStoryboard EMPTYターゲットを追加します。および作業)。

  4. XcodeのTARGETでユニバーサルアプリを設定し、MainStoryboardでiPhone5_Storyboardを、iPad Main Storyで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;
 }
</ code>

これで、iPhone 3/3Gs/4/4s/5 iPod(AllGen)iPad 1/2/3/4 MiniおよびRetina用のユニバーサルアプリが完成しました

みんなありがとう

0
BlackSheep