Thanks for your answer.
It's confirmed that each root view controller supports all orientation. When there is only one window, requestGeometryUpdate:errorHandler: works, but when I add an overlay window (supports all orientation) above it, only the overlay window can rotate.
Another problem is, if I try to rotate the view controller with supportedInterfaceOrientations + setNeedsUpdateOfSupportedInterfaceOrientations(), the overlay window can also cause those APIs to fail.