1

こんにちは、iPhone 5 および iPhone 4/4s 用のアプリを開発しようとしています。ストーリーボードの使用中に問題が発生しました: iPhone 4/4s 用にストーリーボードを設計しましたが、iPhone 5 で試してみると、GUI がうまくいきません...インターネットで読んだ最も簡単な解決策は、2 つのストーリーボードを使用することです: 1 つRetina 4 用と Retina 3.5 用です。コードで別のストーリーボードを呼び出す方法を教えてください。2 つのストーリーボード ファイルを作成しました。

MainStoryboard.storyboard
MainStoryboardiPhone5.stroryboard

デバイスの画面サイズを取得して別のストーリーボードをロードする必要があることをインターネットで見つけましたが、どこでそれを行うべきですか? メソッドの Appdelegate.m で

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

ディスプレイのサイズを検出するために、Web 上に次のコードを作成しました。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if (screenBounds.size.height == 568) {
            NSLog(@"retina 4");
        } else {
            NSLog(@"retina 3.5");
        }
        return YES;
    }

これで、Retina 4 または Retina 3.5 を検出した場合にのみ、別のストーリーボードを呼び出す方法を見つける必要があります。正しいストーリーボードを呼び出すにはどうすればよいですか? ありがとうございました

4

2 に答える 2

11

iPhone 5 の画面の高さは 568 です。

このマクロを使用して、iPhone 5 であることを確認できます。

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

次に AppDelegate.m で iPhone 5 をチェックし、その特定のストーリーボードをロードします。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard *mainStoryboard = nil;
    if (IS_IPHONE_5) {
        mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboardiPhone5" bundle:nil];
    } 
    else {
        mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    }

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [mainStoryboard instantiateInitialViewController];
    [self.window makeKeyAndVisible];

    return YES;
}

アップデート:

次のマクロを使用する

// Check if device is iPhone 5
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON)

// Get the storyboard name according to the device
#define GET_STORYBOARD_NAME(controllerName) IS_IPHONE_5 ? controllerName : [NSString stringWithFormat:@"%@-iPhone4",controllerName]

アプリデリゲート

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:GET_STORYBOARD_NAME(@"Main") bundle:nil];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [storyboard instantiateInitialViewController];
    [self.window makeKeyAndVisible];
    return YES;
}

ノート:

iPhone4 のストーリーボード名は常にこの形式にする必要があります

YourStoryboardName-iPhone4.storyboard

于 2013-06-11T09:17:28.020 に答える
2

あなたが求めていることではないことはわかっていますが、AutoLayout を使い続ける価値はあります。ビューがそれほど異なっていない限り (たとえば、異なるグラフィックスを使用するなど)、AutoLayout は再配置することでほとんどすべてに対応できます。レイアウト アイテムに実際には静的な位置を使用しないため、最初は扱いにくいものです。他のすべてのもの (スーパービュー、他のアイテムなど) に対して物を配置する方法の意図を伝えることで機能します。オンラインでいくつかのチュートリアルをチェックしてください ( Ray Wenderlich のチュートリアルは非常に優れています)。

于 2013-06-11T09:29:25.863 に答える