我正在尝试为 iOS 6 更新我的应用程序,主要挑战是处理自动旋转。有与该主题相关的问题和搜索结果,但没有一个可以直接回答我的问题。我理解弃用和shouldAutorotateToInterfaceOrientation:
替换它- 这个问题与那些没有直接关系。supportedInterfaceOrientations
shouldAutorotate
相反,我有兴趣知道如何替换willAutorotateToInterfaceOrientation:duration:
,这是我的应用程序处理几乎所有旋转动画和布局重组的地方。我的主视图控制器控制一个全屏视图,该视图在启动时添加到主窗口,并处理应用程序的整个内部布局,这有点复杂。此视图控制器中的willAutorotateToInterfaceOrientation:duration:
方法直接调整某些子视图的大小并调用处理其他子视图的 C++ 对象。由于界面的可变性,其中包括复杂的子视图层次结构,一些不调整大小,一些不在屏幕上等等,我不认为 Apple 的自动调整掩码提供了足够强大的解决方案来处理这种自动旋转.
有什么方法可以像我现在一样采取行动willAutorotateToInterfaceOrientation:duration:
吗?正如我在网上和通过实验发现的那样,这个方法didRotateFromInterfaceOrientation:
从来没有在我的 iOS 6 的主视图控制器中调用过。我还发现它viewWillLayoutSubviews
从来没有被调用过,尽管我怀疑它无论如何都不能完全满足我的需要。
如果您需要任何进一步的信息,请告诉我。我希望有一个相当简单的解决方案来解决这个问题,这不是苹果在开发人员不符合新的、更窄的协议的情况下抛弃他们的例子。
编辑:如果这有助于澄清,这是我正在谈论的功能的基本外壳:
在AppDelegate.mm中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self.window makeKeyAndVisible];
MainViewController* mainViewController= [[MainViewController alloc] initWithNibName:nibName bundle:[NSBundle mainBundle]];
[self.window addSubview:mainViewController.view];
return YES;
}
在MainViewController.mm:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView beginAnimations:NULL context:nil];
[UIView setAnimationDuration:duration];
[someViewController someMethod];
[someView setFrame:someRect];
[UIView commitAnimations];
someObject->CustomRotationFunction( toInterfaceOrientation, duration );
}
一般来说,假设这些函数和方法中发生的事情是最坏的,例如someObject
拥有改变其框架的视图,它拥有拥有改变其框架的视图的其他对象,等等。