未调用iOS8接口旋转方法

由于willAnimateRotationToInterfaceOrientation:duration:在iOS8中被弃用 ,所以需要使用viewWillTransitionToSize:withTransitionCoordinator: 来代替 。

但是,这个方法不会在iOS8的我的视图控制器中被调用。 还有什么,我需要执行,为了这个callback工作?

我在文档中找不到任何东西。 我唯一能find的就是它属于新的UIContentContainer协议。 但是,即使我明确地将其添加到我的控制器的协议,它不起作用。

有任何想法吗?

viewWillTransitionToSize:withTransitionCoordinator:似乎只有在界面实际上要改变大小时才起作用,这意味着我们旋转了90度。 如果你的布局上只有一个遮罩,那么当旋转180度时,界面大小不会改变,所以这个方法似乎没有被调用。

我已经在我的应用程序中解决这个问题,而是注册到UIDeviceOrientationDidChangeNotification通知,如:

(在我的视图控制器的viewWillAppear ):

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil]; [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

(在我看来,将会viewWillDisappear [记得取消订阅])

 [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil]; 

我的deviceOrientationDidChange:看起来像:

 - (void)deviceOrientationDidChange:(NSNotification *)notification { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; [self willRotateToInterfaceOrientation:orientation duration:1.0]; } 

按照文档 ,记得打电话给super

 - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; // ... } 

否则,子视图控制器将不会将消息转发给它们。

我知道这个问题在这个时候已经有点老了,但是我认为这个问题可能会以一种不同的方式解决一些可能遇到的问题。 如果您正尝试通过使用addSubview(controller.view)加载属于DIFFERENT控制器一部分的视图,则还需要将该控制器添加到父级(也可能是要添加到控制器中的视图)。 如果您不将控制器添加到父级,您将永远不会收到大小更改的更新。 我们后来发现了苹果API改变的原因; 在iPad Pro中,您的SizeClass可以在不需要旋转的情况下进行多任务处理。 这也将调用方法:

 viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

在父类中,如果您重写上述方法,请确保您调用超级方法,否则您将只能find另一种方法将您的头撞到墙上。