UITraitCollectionの使い方について
現在UITraitCollection
を使ってiPhoneとiPadを区別しようとしているのですが、イマイチUITraitCollection
の使い方がわかりません。
まず以下のようにコードを書いてデバイスの回転時にRegularかCompactかを検知してそれに沿った処理を記述するようにしました。
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
if (newCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
NSLog(@"Regular");
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *VC = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:VC];
[self.splitViewController showDetailViewController:navVC sender:self];
} else {
NSLog(@"Compact");
}
[super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
}
しかし上記のコードだとiPhone 6plusを縦画面から横画面にした時にアプリが落ちます。無限ループのような形で落ちます。なぜアプリが落ちてしまうのでしょうか?
また、showDetailViewControllerに関するロジックを除けてログだけを取るようにすると、なぜか画面を一回転させただけでも、「Compact Regular Compact」というようにログに表示されます。
そして、viewDidLoad
で下記のコードをiPadで実行すると、「Regular Compact」とログが表示されます。
if ([self.traitCollection containsTraitsInCollection: [UITraitCollection traitCollectionWithHorizontalSizeClass: UIUserInterfaceSizeClassRegular]]) {
NSLog(@"Regular");
} else {
NSLog(@"Compact")
}
なぜ二回も呼ばれているのか調べると、willTransitionToTraitCollection
が呼ばれていたようです。画面が回転してないにもかかわらず。
このように、全くUITraitCollectionを使用してiPhoneとiPadを区別することができてません。
なぜ上記のような複数回メソッドが呼ばれたり、アプリが無限ループになって落ちたりする挙動になってしまっているのでしょうか?
色々と調べてみてもUITraitCollection
の具体的な使い方に関する記事が少なく、これ以上どうすればいいかわかりません。
どなたかわかる方がいれば教えていただきたいです。宜しくお願いします。