私は方法を見つけました!
- 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];