[iOS SDK] LandscapeとPortraitで xib ファイルを切り替える方法

公開日: : iPad, iPhone

自分はたいていコードで位置指定するのでこれまで遭遇していなかったけれども Landscape と Portrait で xib ファイル自体を切り替えて対応する方法を調べたのでメモしてみる。

Landscape と Portrait で部品の配置などが大きく異なり、コードでの指定や AutoLayoutでの指定が面倒なときにこの方法を使うことになると思われる。

そもそも今はこういうxibを指定する書き方はしないという話もありそうだけれども。いまだに昔からの書き方でやっている。

iphone – Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape? – Stack Overflow

にある、下記のコードで対応できた。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if( !nibNameOrNil )    {
		 nibNameOrNil = [self nibNameRotated:[[UIApplication sharedApplication] statusBarOrientation]];
	}
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    return self;
}

- (NSString*) nibNameRotated:(UIInterfaceOrientation)orientation
{
    if( UIInterfaceOrientationIsLandscape(orientation))  {   
		return [NSString stringWithFormat:@"%@-landscape", NSStringFromClass([self class])];
	} else {
	    return [NSString stringWithFormat:@"%@", NSStringFromClass([self class])];
	}
}

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    NSString *nibname = [self nibNameRotated:toInterfaceOrientation];
    [[NSBundle mainBundle] loadNibNamed:nibname owner:self options:nil];
    [self viewDidLoad];
}

呼び出し側は

    xxxViewController *viewC = [[xxxViewController alloc]initWithNibName:nil bundle:nil];

のように、引数 nil で呼び出すことを想定している。
また、Landscape 用の xib ファイルは xxxViewController-landscape.xib とする。

基本的にはAdam氏の方法で対応できるのだが、最初からLandscape状態で呼び出されたときにwillRotateToInterfaceOrientation: が呼ばるまで Portrait状態になってしまうのでinitWithNibName: の対応が必要となりました。

関連記事

Topeak iPhone6 Plus 用ライドケースセットを買ってみた

家から最寄り駅まで歩くと結構時間がかかってしまうため、駅前に駐輪場を借りてそこまで自転車で通勤してい

記事を読む

英辞郎第7版からアルクのSVLを EverLearn に取り込む方法

英辞郎 第七版(辞書データVer.136/2013年1月8日版)アルク企画開発部 アルク 2013

記事を読む

Flurryでアプリ利用状況解析

ブログには書く機会がなかったが、昔からアプリで Flurry をアプリに組み込んで、利用状

記事を読む

[iOS9] viewWillAppear で部品の位置が確定しなくなった

どうやら iOS9 から viewWillAppear では部品の位置が確定しなくなったらしく、vi

記事を読む

[iOS SDK] UIPickerView の文字が表示されない

おんぷちゃん for iPad のiOS7対応をしているときに遭遇した問題。 UIPopove

記事を読む

Guideline 2.5.10 – Performance – Software Requirements で Reject

2019年3月27日以降、iPhone Xs Maxの画面サイズ6.5インチのスクリーンショットが

記事を読む

Withings WS-50 不具合発生

昨年12月に購入した Withings WS-50をまずまず便利に使っていたのだが、数週間前から、電

記事を読む

MacPeople 最終号

2014年11月号で休刊。 1995年10月に創刊されたらしい。 最終号はiPhone6/iP

記事を読む

no image

新型 su-pen 購入

新型Su-penを買おうと思いAmazonのカートに入れていたら、翌日見たら売り切れていた...

記事を読む

no image

Admob SDK が Google AdMob Ads SDK になっていた

かなり以前に作ったアプリをアップデートするにあたって、AdMobで謎のエラーが出ているので最新

記事を読む

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Ember Mug 2のACアダプタをUSB Type-Cに変えてみた

冬になると活躍する Ember Mug 2 の充電器は付属のACアダ

Wi-Fi6Eルータ TP-Link AXE5400購入

Wi-Fi6E を試してみたくなり、TP-Link AXE5

児童手当 認定請求書申請 2024 「請求者が養育をする18歳に達する日以降の最初の3月31日までの子の数」とは?

2024年に受給していない人には手紙が届くらしい。 電子申請も

Vision Proアプリ開発本 8/24、8/26に発売

Vision Proアプリ開発入門 P400が 8/24 に発売、V

Developer Strap が日本でも購入可能に

USアカウントでしか購入できなかった Vision Pro 用 De

→もっと見る

PAGE TOP ↑