この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
iPhone 6 Plus の Landscape が iPad っぽいワケ
iPhone 6 Plus の発表を見ていると、Landscape 表示が iPad のように2画面表示になっていることに驚かれたかたも多かったと思います。
その理由はこちらの記事でも触れているように、Size Class で iPhone 6 Plus の Landscape の Width が iPad 同様に Regular になっているためです。
Portrait - Width | Portrait - Height | Landscape - Width | Landscape - Height | |
---|---|---|---|---|
iPhone 5s iPhone 6 |
Compact | Regular | Compact | Compact |
iPhone 6 Plus | Compact | Regular | Regular | Compact |
iPad | Regular | Regular | Regular | Regular |
iPhone 5s や iPhone 6 などでも行いたい場合、画面構成を少し調整すれば同様に2画面表示にすることが可能です。
Split View Controller を2画面構成にする
Split View Controller を2画面構成にするには、横表示(Landscape)で Regular と判定されれば良いわけです。iPhone 5s / iPhone 6 は Landscape の Width は Compact なので、ここを書き換える必要があります。そのため、Split View Controller の親の View Controller を作成し、その親クラスで setOverrideTraitCollection:forChildViewController: を呼んであげる必要があります。 このメソッドは子の View Controller の Trait Collection を上書きするメソッドです。
ということで、下図のように新しく View Controller を作成し、Split View Controller を Container View の中に入れます。
あとは View Controller を下記のように実装します。viewWillTransitionToSize: は Size Classes が変更されたとき、つまり Portrait - Landscape 切替時に呼ばれるメソッドです。
import UIKit
class ContainerViewController: UIViewController, UISplitViewControllerDelegate {
// MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
// TraitCollectionの更新
performTraitCollectionOverrideForSize(view.bounds.size)
// Navigation Controllerの調整
let splitViewController = self.childViewControllers[0] as UISplitViewController
let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController
navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem()
splitViewController.delegate = self
}
// MARK: Trait Collection
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
performTraitCollectionOverrideForSize(size)
}
private func performTraitCollectionOverrideForSize(size: CGSize) {
var overrideTraitCollection: UITraitCollection? = nil
// widthが480以上の場合はRegularを設定
if size.width >= 480 {
overrideTraitCollection = UITraitCollection(horizontalSizeClass: .Regular)
}
for vc in self.childViewControllers as [UIViewController] {
setOverrideTraitCollection(overrideTraitCollection, forChildViewController: vc)
}
}
// MARK: - Split view
func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController!, ontoPrimaryViewController primaryViewController:UIViewController!) -> Bool {
if let secondaryAsNavController = secondaryViewController as? UINavigationController {
if let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController {
if topAsDetailController.detailItem == nil {
// Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
return true
}
}
}
return false
}
}
実行して横画面表示にすると、2画面構成で表示されます。
まとめ
ということで、アプリ側の対応次第で iPhone 5s / iPhone 6 でも Split View Controller を2画面構成にできることがお分かりいただけたかと思います。iOS 8 からは Landscape 表示でステータスバーが消えてスペースが広くなっているので、今まで以上に使う機会が多いかもしれません。ぜひ参考にしてください。