未调用 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 方法

iOS 8 - 应用程序未正确旋转

将旋转到 iOS 8 上未调用的界面方向

旋转时未调用 UICollectionViewDelegateFlowLayout 方法

在 iOS5 中未调用 UIViewController 设备旋转委托方法

ios 8 - MPMoviePlayerController 视频未相应旋转