How to implement UIViewController rotation in response to orientation changes?

前端 未结 4 1192
伪装坚强ぢ
伪装坚强ぢ 2021-01-18 03:14

My app has about 10 different UIViewControllers, just one of which I want to switch to landscape mode if the device is rotated. (All the rest, I want to keep in portrait.)

4条回答
  •  执念已碎
    2021-01-18 03:50

    when you implement UINavigationController, this class is your the parent that controls all the children viewControllers that will be pushed into the stack. Therefore, the RootViewController is the only controller that say Yes or No to autorotation. Even if, you are passing Yes to auto-rotation in children view controllers, they don't count!

    This is the nature of UINavigationController. So to change it, you have two choices:

    1- Manually manipulate it, which requires you to go through some cumbersome codes.

    2- Change your design so that it is more compatible to UINavigationController. That single view that should rotate, should be get called by the RootViewController (not the Navigation Root View Controller -- they are named the same, but are totally different), the view that hosts NavController. And when the device rotates, it will either push the NavController to the view or the other.

    3- The other method, which will also work, but is not recommended because it violates the concept of MVC, is that your NavController can listen to Notifications. That particular child view that CAN and SHOULD rotate can cast a notification -- e.g. rotateMe, and once the NavController hears it, it rotates.

    As I said, it will work, but it violates the MVC model -- which is fine to Apple, but from programming perspective is not recommended.

    If you need further explanation about either of them, please let me know.

提交回复
热议问题