未调用 iOS8 接口旋转方法
Posted
技术标签:
【中文标题】未调用 iOS8 接口旋转方法【英文标题】:iOS8 Interface Rotation Methods not called 【发布时间】:2014-09-19 13:22:32 【问题描述】:由于willAnimateRotationToInterfaceOrientation:duration:
在ios8中是deprecated,所以需要使用viewWillTransitionToSize:withTransitionCoordinator:
instead。
但是,我在 iOS8 上的视图控制器中不会调用此方法。 为了让这个回调起作用,我还需要实现什么吗?
我在文档中找不到任何内容。我唯一能找到的是它属于新的UIContentContainer
协议。但是,即使我明确地将其添加到控制器的协议中,它也不起作用。
有什么想法吗?
【问题讨论】:
我正在加载我的 viewController 作为分段按钮的视图。在这种情况下,我没有调用 viewWillTransitionToSize:withTransitionCoordinator:。你是如何尝试加载 viewController 的? 【参考方案1】: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];
【讨论】:
这个解决方法也对我有用,似乎是迄今为止最好的解释 对于那些没有状态栏想要进行非标准旋转的人来说,这也很有效:- (void)deviceOrientationDidChange:(NSNotification *)notification UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; NSLog(@"rotation %li", (long)orientation);
【参考方案2】:
按照docs,记得拨打super
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// ...
否则子视图控制器将无法将消息转发给它们。
【讨论】:
虽然这是一个有用的建议,但我可能错过了如何回答原始问题...? 谢谢,在我的情况下:我想念调用 add childViewController。 :D @yura 如果另一个班级正在接收消息并且没有通过调用 super 将其传递,那么您正在工作的班级可能不会收到它。【参考方案3】:我知道这个问题在这一点上有点老了,但我认为对于一些可能遇到它的人来说,这个问题可能会以不同的方式解决。如果您尝试使用addSubview(controller.view)
加载属于不同控制器的视图,则还需要将该控制器添加到父级(可能是您要添加到控制器的视图)。如果您不将控制器添加到父级,您将永远不会收到大小更改的更新。后来我们发现了苹果 API 变化的原因;使用 iPad pro,您的 SizeClass 可以通过多任务处理能力进行更改而无需旋转。这也会调用方法:
viewWillTransitionToSize(size: CGSize,
withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
在父类中,如果你重写了上面的方法,请确保你也调用了super,否则你会找到另一种方法来敲墙......
【讨论】:
太棒了...解决了我的问题。我没有调用超级,也没有调用这个方法。开始调用 super,然后 pow... 开始工作了。 +1 for :- 如果您尝试使用 addSubview(controller.view) 加载属于不同控制器的视图,您还需要将该控制器添加到父级(可能是您添加到控制器的视图)。如果您不将控制器添加到父级,您将永远不会收到大小更改的更新。 非常感谢!我没有注意到在我的父视图中(对于我的大部分应用程序)我没有调用 super ,因此没有一个子视图执行这些方法。以上是关于未调用 iOS8 接口旋转方法的主要内容,如果未能解决你的问题,请参考以下文章
iOS8.1.2 未插入设备时不调用didReceiveRemoteNotification 方法
旋转时未调用 UICollectionViewDelegateFlowLayout 方法