1

ユーザーが iPhone 5/iPod Touch の 4 インチ画面と 3.5 インチ画面のどちらを使用しているかをチェックする iPhone アプリ用に個別の nib ファイルをロードするにはどうすればよいですか?

これは init メソッドで行われますか?

詳細 - アプリ全体でストーリーボードを使用していません。ある時点で、ストーリーボードを使用して、View Controller の 1 つから呼び出します。(絵コンテでも区別する方法はありますか?)

  • 各個別のviewControllerで初期化するソリューションを探しています...一度だけ実行されるappdelegateに入れるものではありません。

  • 自動レイアウトは、多くの状況で機能しません。デザインは非常にグラフィカルで、余白が多すぎると見栄えが悪くなります。

4

1 に答える 1

3

私は方法を見つけました!

  • 3.5 インチ / iPhone 非 Retina 用と iPhone5 用に、別々の nib ファイルを作成します。
  • マクロを使用して、現在の電話が iPhone 5 形式かどうかを確認します。(1)
  • 通常の initWithNibName:bundle の場合: 通常の初期化子を使用しないように例外を記述します。私はそれを@「間違った初期化子」と名付けました
  • initForFormat という名前の viewController 用の新しい指定イニシャライザを作成しました。
  • マクロを使用して、デバイスが iPhone 5 かどうかを確認します。それが iphone5 の場合は、ペン先名 ViewControllerIphone5 で初期化します

マクロhttps://stackoverflow.com/a/13068238/1492368から RayOfHope からこのマクロを取得しました

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

そのため、新しい指定されたイニシャライザ initForLayout: に次のように記述します。

if(IS_IPHONE_5)
    {
        self=[super initWithNibName:@"DetailViewControlleriPhone5" bundle:nil];
    }
    else
    {
        self=[super initWithNibName:@"DetailViewController" bundle:nil];
    }

古い初期化子

Big Nerd Ranch からこれを学びました: 標準イニシャライザを使用するときに例外をスローする

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

    @throw [NSException exceptionWithName:@"Wrong initializer"
                                   reason:@"Use initForLayout:"
                                 userInfo:nil];
    return nil;
}

別のViewController / AppDelegateからView Controller を呼び出すしたがって、別のView ControllerまたはappdelegateからこのDetailViewControllerを呼び出すと、次のように記述します。

DetailViewController *detailViewController = [[DetailViewController alloc] initForLayout];
于 2013-01-08T16:25:02.360 に答える