There's a method--willTransitionToTraitCollection:withTransitionCoordinator:--that lets you know when any trait (e.g. horizontal size class, vertical size class, display scale, or user interface idiom) changes.
You can check newCollection.verticalSizeClass
to see if it equals .Compact
(landscape) or .Regular
(portrait) when UIDevice.currentDevice().userInterfaceIdiom != .Pad
So, for example:
override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator)
if UIDevice.currentDevice().userInterfaceIdiom != .Pad {
switch newCollection.verticalSizeClass {
case .Compact:
goLandscapeWithCoordinator(coordinator)
case .Regular, .Unspecified:
hideLandscapeWithCoordinator(coordinator)
}
}
}
goLandscapeWithCoordinator(coordinator)
could look something like this, for instance:
func goLandscapeWithCoordinator(coordinator: UIViewControllerTransitionCoordinator) {
let landscapeVC = storyboard!.instantiateViewControllerWithIdentifier("LandscapeViewController") as? LandscapeViewController
if let controller = landscapeVC {
controller.view.frame = view.bounds
controller.view.alpha = 0
view.addSubview(controller.view)
addChildViewController(controller)
coordinator.animateAlongsideTransition({ _ in
controller.view.alpha = 1
},
completion: { _ in
controller.didMoveToParentViewController(self)
})
}
}