With iOS 5, Apple added support for creating parent/child relationships between view controllers.
Before, you were pretty much limited to navigation controllers and tab bar controllers as a way to organize your view controllers, and it was all but impossible to have multiple view controller's views on the screen at once and make everything work correctly. (auto-rotation, low memory warnings, etc.)
In fact, the Apple docs explicitly state that for iPhone and iPod touch, a view controller's view must fill the whole screen.
All those things change, and in a very elegant way, with the new support for parent/child view controllers.
It's now easy and clean to create your own custom parent view controllers that manage child view controllers. You can create variations on navigation controllers or tab bar controllers that manage multiple child view controller that take up the whole screen, or you can create unique arrangements where a parent view controller divides the window up into sections and uses child view controllers to manage each section. This lets you write very modular code, and create cool effects.
Imagine, for example, a board game that supported a variety of different games. It could have a parent view controller in charge of the whole screen. It could have a subview dedicated to the game board, and invoke one of several game board controllers that was in charge of handling the game board area. It could have a chat view controller that was in charge of in-game chat, that worked across all the different games. It could also have a tool palette controller that managed the controls the user used to interact with the game.
There is a new method in UIViewController, transitionFromViewController:toViewController:dura tion

ptions:animations:completion:. It lets you switch from one child view controller to another, and supports a variety of "stock" transition styles. The list of transitions is missing some important ones like slide-from-left and slide-from-right, which is puzzling. However, because it takes an animation block as a parameter, it is trivial to implement the missing transitions yourself.
I've written a general purpose view controller transition method that takes a transition type enum as a parameter, and supports a large number of transitions. For the ones supported directly by transitionFromViewController:toViewController:dura tion

ptions:animations:completion:, it just requests that transition type. For the types I added, it specifies a transition type of none, and then uses the animations block to make the new transition type happen.
The transitionFromViewController:toViewController:dura tion

ptions:animations:completion: method is really powerful. It lets you easily implement just about any kind of transition on a portion of the screen or the whole screen. And, once you wrap your head around how to use block-style animations, it's EASY to use!