由于iOS8中willAnimateRotationToInterfaceOrientation:duration:
为deprecated,因此需要使用viewWillTransitionToSize:withTransitionCoordinator:
instead。
但是,在iOS8上的视图控制器中不会调用此方法。 还有什么我需要实现,以便这个回调工作?
我在文档中找不到任何内容。我唯一能找到的是它属于新的UIContentContainer
协议。但是,即使我明确地将其添加到我的控制器的协议中,它也不起作用。
有什么想法吗?
答案 0 :(得分:38)
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];
}
答案 1 :(得分:36)
根据docs,请记得致电super
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// ...
}
否则子视图控制器将不会将消息转发给他们。
答案 2 :(得分:7)
我知道这个问题在这一点上有点陈旧但我认为这个问题可能会以某种不同的方式解决。如果您尝试使用addSubview(controller.view)
加载属于DIFFERENT控制器的视图,您还需要将该控制器添加到父级(可能是您要添加到控制器的视图)。如果您不将控制器添加到父级,则永远不会收到大小更改的更新。我们后来发现了Apple改变API的原因;使用iPad专业版,您的SizeClass可以随着多任务处理能力而无需轮换。这也将调用方法:
viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
在父类中,如果你覆盖上面的方法,请确保你也打电话给超级或者你会找到另一种方法来击败你的头......